现在的位置: 首页 > 综合 > 正文

提供开放的activity调用

2014年02月13日 ⁄ 综合 ⁄ 共 2347字 ⁄ 字号 评论关闭

今儿学到一个东西,可以将自己的activity开放出来供第三方调用

大概有两种方式,一种是指定特定的调用名称,一种是隐式的调用

第一种:

在被调用的的activity注册时加上如下filter:

<activity android:name="test.sam.ActivityB" >
            <intent-filter >
                <action android:name="samyou_intent"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
 </activity>

在调用时使用如下语句:

startActivity(new Intent("samyou_intent"));

第二种:

类似自制浏览器一样,通过对uri的判断来决定是否调用。

在被调用的的activity注册时加上如下filter:

<activity android:name="test.sam.ActivityB" >
            <intent-filter >
                <data android:scheme="http"/>
                <action android:name="android.intent.action.VIEW"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <category android:name="android.intent.category.BROWSABLE"/>
            </intent-filter>

 </activity>

在调用的activity使用如下语句:

Uri uri = Uri.parse("http://www.baidu.com");
Intent intent = new Intent(Intent.ACTION_VIEW,uri);    

intent.addCategory(Intent.CATEGORY_DEFAULT);
startActivity(intent);

在被调用的activity中如果要获取uri使用语句

Uri uri =  getIntent().getData();

好了下面说一下action data category这几个标签的作用

这几个标签主要是用来对intent意图的过滤,帮助系统找到匹配的activity来执行

action是动作标签,Intent.ACTION_VIEW就是系统定义的一个默认显示动作,当然用户可以自定义动作名称,在调用activity时,只有声明了该动作的activity符合匹配条件,一个activity可以注册很多动作。

data是数据标签,标明了什么样格式的uri可以满足匹配过滤的条件,在上面的例子中<data android:scheme="http"/>就表明uri中前缀是http开头的intent意图符合匹配条件

category是附带执行环境过滤条件,一个activity要想成功被调用,就必须满足所有调用该activity时附加的条件。

举个例子,上例中调用时只附加了一个条件:

intent.addCategory(Intent.CATEGORY_DEFAULT);

而被调用的activityB注册时包含了该条件

<activity android:name="test.sam.ActivityB" >
            <intent-filter >
                <data android:scheme="http"/>
                <action android:name="android.intent.action.VIEW"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <category android:name="android.intent.category.BROWSABLE"/>
            </intent-filter>

 </activity>

所以能够成功被调用

如果我们把上述调用改为

Uri uri = Uri.parse("http://www.baidu.com");
Intent intent = new Intent(Intent.ACTION_VIEW,uri);
intent.addCategory(Intent.CATEGORY_BROWSABLE);
intent.addCategory(Intent.CATEGORY_DEFAULT);
startActivity(intent);

而被调用改为

<activity android:name="test.sam.ActivityB" >
            <intent-filter >
                <data android:scheme="http"/>
                <action android:name="android.intent.action.VIEW"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>

 </activity>

那么该ActivityB无法被调用,因为调用时指定的条件intent.addCategory(Intent.CATEGORY_BROWSABLE);并没有被声明,这时系统认为ActivityB不满足调用者的需求

所以导致匹配失败而无法成功调用

by samyou

抱歉!评论已关闭.