(一) Intent的介绍:intent的意思为“意图”,在android中使用intent来封装“启动程序”,所以不管程序想启动Actiity,Service,BroadcastReceiver,都是使用intent,这种方式提供了一种统一的编程模式。
启动一个activity.
startActivity(intent).
startActivityForResult(Intent intent,int ResultCode).
启动一个Service.
ComponentName startService(Intent intent).
boolean bindService(Intent service,ServiceConnection conn,int flags).
启动一个BroadcastReceiver。
sendBroadcast(Intent intent,String receiverPermission).
sendOrderBroadcast(intent,String receiverPermission,BroadcastReceiver resultReceiver,Handler scheduler,int initialCode,String initialData,Bundle initialExtras).
sendOrderBroadcast(Intent intent,String receiverPermission).
(二)Intent的属性 :Compoent,Action,Category,Data,Type,Extra,Flag(7种属性)
1.Compoent:(显示启动)
// 创建一个ComponentName对象 ComponentName comp = new ComponentName(MainActivity.this,SecondActivity.class); Intent intent = new Intent(); // 为Intent设置Component属性 intent.setComponent(comp); startActivity(intent);
上图的代码可以简化为:
Intent intent=new Intent(MainActivity.this,Main2Activity.class);
startActivity(intent);
2.Action and Category,data属性:(隐式启动)
Action只是一个抽象动作,例如Intent.ACTION_VIEW代表一个抽象的查看动作,他
不管具体查看什么,只要<intent-fliter.../>中包含Intent.ACTION_VIEW,该Activity
就有可能被启动。
Category,Data则用于为Action附加额外的信息。如果要隐式启动哪个Activity,
三者必须要全部匹配或者部分匹配。<intent-fliter.../>可以包含多个<action.../>,
<category.../>,可以包含一个<data.../>子元素。
TestActivity.java --需要隐式启动的Activity
(1) 根据Action和Category来进行匹配
<activity android:name=".TestActivity" android:label="TestActivity">
<intent-filter >
<action android:name="cc.android/myaction.leo"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
在MainActivity.java里启动它:
intent.setAction( "cc.android/myaction.leo");
//不加下面这行也行,因为intent的这个属性默认值即系Intent.CATEGORY_DEFAULT
intent.addCategory(Intent.CATEGORY_DEFAULT);
startActivity( intent );
总结:
a.在某个Activity里用startActivity()方法发送一个intent,这个intent设定了一些条件,比如用方法
setAction(),addCategory()设定了两个属性,发送了这个intent之后,android会去系统里保存的MainManifest.xml
清单(假设这个系统存放全部apk清单的文件为MainManifest.xml)里查找符合这两个属性的activity,然后启动它。
b.任何一个需要隐式启动的Activity都必须要有这项:
<category android:name="android.intent.category.DEFAULT"/>
例外情况是:android.intent.category.MAIN和android.intent.category.LAUNCHER的filter中没有必要加入android.intent.category.DEFAULT,当然加入也没有问题.
c.如果当两个Activity的action属性一样,android系统会跳出一个对话框让你选择启动哪一个Activity。
d.单单靠添加addCategory属性不能匹配。
e.当匹配不上任何Activity的话,会发生异常,跳出对话框:很抱歉...某某应用程序意外停止,请重试。
f.Service和BroadcastReceiver 同理
g.每个Intent对象最多只能包含一个Action属性。
(三)Data,Type属性:
Data属性通常用于向Action属性提供操作数据。Data属性接受一个Uri对象。
Uri字符串总是满足如下格式:scheme://host:port/path.
Types属性跟Data属性大部分相似,这两个属性会相互覆盖。如果先设置Type属性,后设置Data属性,则Type属性会覆盖Data属性。反之成立。如果希望既有Type又有Data属性,则用intent.setDataAndType()
的方法。
<data .../>只设置了android:port属性,没有指定android:host属性,那么android:port属性将不会有作
用。
(四)Extra属性:
Intent的Extra属性用于在多个Action之间进行数据之间的交换,Intent的Extra应该是一个Bundle对象,Bundle对象就像Map<key,values>,它可以存入多个key-values对。运用Extra属性就可以进行数据间的交换。
(五)Flag属性:
Flag意为旗标,Intent可以调用addFlags()方法来添加旗标。Intent中有大量的Flag,此处不再一一说明。