今儿学到一个东西,可以将自己的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