本篇仅是个人学习笔记,内容为个人理解,如有错误还请提醒。
Intent可以用来启动Activity(startActivity(Intent))
、Serveice(startService(Intent))
等组件,可以用来绑定Activity和Service以建立它们之间的通信(bindServiceConnaction(Intent,ServiceConnection,int)
),可以作为Broadcast Intent发送给广播接收器(sendBroadcast(Intent)
)。
执行的动作类型。在定义自定义action时,需要包含app的包名,例如:
static final String ACTION_TIMEREVEL = "com.exmple.action.TIMERAVEL"
动作名称 | 作用 |
---|---|
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" |
操作数据,包括了Uri类型数据和MIME Type类型数据。数据域应该和action要匹配。
类别名称 | 作用 |
---|---|
CATEGORY_DEFAULT |
把一个组件Component设为可被implicit启动的。 |
CATEGORY_LAUNCHER |
把一个action设置为在顶级执行。并且包含这个属性的Activity所定义的icon将取代application中定义的icon。 |
CATEGORY_BROWSABLE |
当Intent指向网络相关时,必须要添加这个类别 |
CATEGORY_HOME |
使Intent指向Home界面 |
CATEGORY_PREFERENCE |
定义的Activity是一个偏好面板Preference Panel。 |
**显示的指定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将都能通过过滤器。
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,Clsaa>class); //构造一个有指定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的Component属性。
如果不想app中的组件被其他app启动,在manifest.xml中将组件的android:exported
属性设置为false。
Intent i = new Intent(Context,Activity.class); //注意,此处名字必须与java文件完全一致。
没有指定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()。
PendingIntent是一种未定意图,它可以停留在系统中,直到有接收它的组件出现。获得它的实例的方法:
PendingIntent.getActivity(),
PendingIntent.getService(),
PendingIntent.getBroadcast(),
taskStackBuilder.getPendingIntent()。
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
//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);
}