android开发之Intents and Intent Filters

来源:互联网 发布:知乎怎么回答问题 编辑:程序博客网 时间:2024/06/06 01:47

      (一) 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,此处不再一一说明。

0 0
原创粉丝点击