Android——Intent简介

Intent简介

本篇仅是个人学习笔记,内容为个人理解,如有错误还请提醒。

Intent可以用来启动Activity(startActivity(Intent))Serveice(startService(Intent))等组件,可以用来绑定Activity和Service以建立它们之间的通信(bindServiceConnaction(Intent,ServiceConnection,int)),可以作为Broadcast Intent发送给广播接收器(sendBroadcast(Intent))。

Intent的属性:

主要属性

Action

执行的动作类型。在定义自定义action时,需要包含app的包名,例如:

static final String ACTION_TIMEREVEL = "com.exmple.action.TIMERAVEL"
  • Activity Actions
动作名称 作用
ACTION_MAIN 表示程序入口
ACTION_VIEW 自动以最合适的方式显示Data
ACTION_EDIT 提供可以编辑的
ACTION_PICK 选择一个一条Data,并且返回它
ACTION_DAIL 显示Data指向的号码在拨号界面Dailer上
ACTION_CALL 拨打Data指向的号码
ACTION_SEND 发送Data到指定的地方
ACTION_SENDTO 发送多组Data到指定的地方
ACTION_RUN 运行Data,不管Data是什么
ACTION_SEARCH 执行搜索
ACTION_WEB_SEARCH 执行网上搜索
ACRION_SYNC 执同步一个Data
ACTION_INSERT 添加一个空的项到容器中

* Broadcast Actions

动作名称 作用
ACTION_TIME_TICK 当前时间改变,并即时发送时间,只能通过系统发送。调用格式"android.intent.action.TIME_TICK"
ACTION_TIME_CHENGED 设置时间。调用格式"android.intent.action.TIME_SET"

Data

操作数据,包括了Uri类型数据和MIME Type类型数据。数据域应该和action要匹配。

次要属性

  • category(类别)
    这是Action的附加信息,它可以进一步的明确一个Intent。
类别名称 作用
CATEGORY_DEFAULT 把一个组件Component设为可被implicit启动的。
CATEGORY_LAUNCHER 把一个action设置为在顶级执行。并且包含这个属性的Activity所定义的icon将取代application中定义的icon。
CATEGORY_BROWSABLE 当Intent指向网络相关时,必须要添加这个类别
CATEGORY_HOME 使Intent指向Home界面
CATEGORY_PREFERENCE 定义的Activity是一个偏好面板Preference Panel。

  • Type(数据类型)

**显示的指定Intent的数据类型,而跳过了通过Uri进行推导判断的步骤。
如:Vedio、Image、Voice等。**

  • component(组件)
    指定Intent的目标组件名称,当指定了这个属性后,系统将跳过匹配其他属性,而直接匹配这个属性来启动对应的组件。

  • extras(附加信息)
    可以附加一些数据在Intent中。

IntentFilter意图过滤器要匹配Intent,需要在Manifest.xml文件中指明相应的Action、Categroy、Type(这是一种Data的属性)来过滤匹配,如果一个Intent包涵多个Category属性,那么想要匹配它的组件就需要在标签中也同样指明这些属性。
如果没有明确的指定Intent的指向Data数据的Uri,那么可以给他指定Uri的属性,包括:scheme、host、port、path。一条Uri的结构是这样的://:/

<data android:scheme="content"
      android:host="com.icechen.mydemo"
      android:port="200"
      android:path="/folder/subfolder/etc"/>

Uri的这几个属性是线性关系,上一级未指定,那么下一级就会失效。
当一个意图过滤器IntentFilter包含Uri其中一个或多个属性时,拥有这些属性的Intent将都能通过过滤器。

  • Flag
    通过setFlags(int)或者addFlags(int)可以把标签flags用在Intent中。
类型 作用
FLAG_ACTIVITY_CLEAR_TOP 相当于Single_Task
FLAGE_ACTIVITY_SINGLE_TOP 相当于Single_Top
FLAG_ACTIVITY_NEW_TASK 类似于Single_Instance
FLAG_ACTIVITY_NO_HISTORY 当离开该Activity后,该Activity将被从任务栈中移除

构造方法:

Intent(Intent intent);  //通过复制一个Intent来创建一个新的Intent
Intent(String action);  //构造一个指定action的Intent对象
Intent(String action,Uri uri); //构造一个指定action,并且有指向数据的uri的Intent对象
Intent(Context packageContext,Clsaaclass); //构造一个有指定Component属性的Intent

常用方法:

addCategory(String Category); //添加一条Category属性
addFlags(int Flags); //添加一条Flag标签
clone();  //复制一个Object类型的对象
getExtras(); //获得一个Bundle对象
getSourceBounds(); //获得发送Intent的组件的边界坐标
makeMainActivity(ComponentName mainActivity); //创建一个Category属性为luancher的Intent去启动mainActivity
parseUri(String uri,int flags) //通过解析一个uri获得一个Intent对象
setComponent();  //添加component属性
setClass();  //相当于添加component属性
setClassName();  //相当于添加component属性
resolveActivity(PackageManager);  //解析Intent启动的Activity,返回ComponentName对象
createChooser(Intent target,CharSequence title);//  创建一个有选择对话框的Intent
getData();setType();
getData();getType();
设置/获得Data/Type类型的数据

Intent的两种主要形式:

显示意图Explicit Intent:

直接指定了Intent的Component属性。
如果不想app中的组件被其他app启动,在manifest.xml中将组件的android:exported属性设置为false。

Intent i = new Intent(Context,Activity.class);    //注意,此处名字必须与java文件完全一致。

隐式意图Implicit Intent:

没有指定Component属性,所以它必须包含足够的信息去告诉System应该去匹配运行哪一个组件。

启动Service只能使用Explicit显示意图,否则在Android5.0以后会报错。因此,在标签中,不要添加意图过滤器,即标签。
当需要同时设置Intent的Type类别和Uri类别时,只能使用setDataAndType(Uri data,String type)方法,分开设置是无效的
当使用implicit隐式意图去启动一个app时,应该调用Intent对象的resolveActivity(getPackageManager())来获取所启动的类,并判断是否存在,如果不存在需要程序会崩溃;所以需要判断返回的对象不为空后才能调用startActivity(Intent)
使用createChooser(Intent,charSequence)方法创建Intent,然后调用startActivity(),当有多个匹配时,会弹出选择对话框供用户选择。
PackageManager提供了一系列查询可以响应Intent的组件的方法:queryIntentActivity()、queryIntentServices()、queryBroadcastReceiver()。

Pending Intent

PendingIntent是一种未定意图,它可以停留在系统中,直到有接收它的组件出现。获得它的实例的方法:

PendingIntent.getActivity(),
PendingIntent.getService(),
PendingIntent.getBroadcast(),
taskStackBuilder.getPendingIntent()。

使用Intent的Extral属性传递数据:

intent.putExtral(键,值);   /*在意图中绑定一个数据,参数说明:
      第一个参数是第二个参数的键;
      第二个参数是要传递的值。*/
startActivity(i);  //启动一个Activity。 
intent = getIntent();  //获得启动该活动的Intent对象。
intent.getObjexctExtra(键);  /*获得Intent对象中的指定数据。参数说明:该参数就是之前定义的键,通过该方法来获得其对应的数据。*/
/*使用Bundle类(一个数据包)传递数据:

传出时:*/
Boudle bundle1 = new Bundle();  //创建一个Bundle对象。
bundle1.put(键1,值1); //把一个键值数据对添加到Bundle对象中。
bundle1.put(键2,值2);
Bundle bundle2 = new Bundle();
bundle1.put(bundle2);  //bundle中可以装Bundle对象。
intent.putExtras(bundle1);  //把数据包附加在Intent对象上。

intent.purExtra(键,bundle1);  //把Bundle对象作为键值对附加在Intent对象上。

//接收时:
Bundle b = intent.getExtras();  //从Intent对象中获取Bundle对象(数据包)。
bundle.getObject(键);  //获得数据包中,该键的值。
bundle.getObject(键,默认值);  //当值不存在时,则设置为默认值。

Bundle b2 = i.getExtraBundle();//获得键值对中的Bundle对象。可以传递复杂数据。

/*使用Serializable(流.note )和Pacelable接口序列化对象来传递对象:*/
  class A implemernts Serializable{


  };  //这种方法传输A类对象时,效率较低,但无需重写其方法。

//传递/获得对象的方法:
intent.putSerializableExtra(键,值));
intent.getSerializableExtra(键);

bundle1.putSerializable(键-值);
bundle1.getSerizlizable(键);

  class A implements Parcelable{


};  //这种方法效率较高,但是要重写2个方法:
  public int describeContents(){
     return 0;  //这个方法这样些就行了
   }
  public void writeToParcel(Parcel dest,int flage){
     dest.writeObject1(Object的Object1类型参数); 
     dest.writeObject2(Object的Object2类型参数);  //写出该类的对象的参数(通过该类的getExmple()方法获得数据)
 }

还需要添加一个对象:
public static final Parcelable.Creator CREATOR = new Creator(){
  public Object createFromParcel(Parcel source){
     return new Object(source.readObject1,source.readObject2);//这里是用实现Parcalable接口的对象的参数来新建一个对象,把它作为返回值。相当于从parcel中取出对象。
  }
  public Object[] newArray(int size){
    return new Object[size];
}
/*注意:上面的红色部分一定要大写,否则会报错!writeToParcel()和createFromParcel()的先后顺序需要对应。implements的对象不适用于存盘操作。
传递/获得对象的方法:*/
intent.putParcelableExtra(键,值);
intent.getParcelableExtra(键);

bundle1.putParcelable(键,值);
bundle1.getParcelable(键); 
  

由A启动B,再由B返回一个数据给A的操作:

//B这边:
Intent inetnt = getIntent();
intent.putExtra(键,值);
setResult(1,i); //由这个方法返回一个数据给A

//A这边:
Intent intent = new Intent();
startActivityForResult(i,0);   //使用这种方法才能接收B返回的数据。

/**
*@param requstCode 对应A中的请求码
*@param resultCode 对应B中的返回码
*@param data B中的Intent对象
*/
@Override
protected void onActivityResult(int requstCode,int resultCode,Intent data){
    super.onActivityResult(requestCode,resultCode,data);
   }

你可能感兴趣的:(Android—基础部分)