隐式意图的使用

来源:互联网 发布:淘宝充气泵怎么试用? 编辑:程序博客网 时间:2024/06/06 03:22

提到隐式意图:首先应想到显示意图,也就是我们开发中常用的。


显示意图一般是打开本应用自己的界面使用;而隐式意图则是打开其他应用的界面,例如分享,打开mp3等,隐式意图是对自己代码进行保护。


上代码:

<activity    android:name="com.example.andong.share.implicitintent.OwnActivity">    <intent-filter >        <!--可以定制多个动作  程序中只要有一个匹配就行 -->        <action android:name="android.andong.second"/>        <!--自定义的category -->        <category android:name="android.andong.category" />        <!--默认的类别,必须有  -->        <category android:name="android.intent.category.DEFAULT" />        <!--路径匹配  协议://主机名:端口号/路径 -->        <data android:scheme="http" android:host="www.andong.com" android:port="8080" android:path="/person"/>        <!--数据类型匹配 -->        <data android:mimeType="person/jpeg"/>    </intent-filter></activity>
Intent intent3 = new Intent();intent3.setAction("android.andong.second");intent3.addCategory("android.andong.category");intent3.setDataAndType(Uri.parse("http://www.andong.com:8080/person"), "person/jpeg");startActivity(intent3);

解读:

action:相当于一个动作,可以有多个,满足一个即可

category:其中android默认的是必须有的,其次自己可以自定义;在startActivity时,会将默认的category加上

data:相当于一个uri,(<scheme>://<host>:<port>/[<path>|<pathprefix>|<pathpattern>],例如:http://www.baidu:80:search/info)

mimeType:表示本页面可处理的类别(能处理什么东西);


这里需要注意一点:setData和setType不能一起使用,因为这两个方法会批次清楚对方的值;要使用setDataAndType方法


如果两个activity的intent-filter完全一样,那么会在页面底部弹出对话框让你选择跳转那个页面,就好比分享弹出来很多一样;

在start时,如果有两个activity,如下:

<activity    android:name="com.example.andong.share.implicitintent.OwnActivity">    <intent-filter >        <!--可以定制多个动作  程序中只要有一个匹配就行 -->        <action android:name="android.andong.second"/>        <!--必须指定一个类别  用startActivity启动 -->        <category android:name="android.andong.category" />        <!--默认必须指定一个类别 用startActivity启动 -->        <category android:name="android.intent.category.DEFAULT" />    </intent-filter></activity><activity    android:name="com.example.andong.share.implicitintent.Own1Activity">    <intent-filter >        <!--可以定制多个动作  程序中只要有一个匹配就行 -->        <action android:name="android.andong.second"/>        <!--默认必须指定一个类别 用startActivity启动 -->        <category android:name="android.intent.category.DEFAULT" />    </intent-filter></activity>
Intent intent3 = new Intent();intent3.setAction("android.andong.second");startActivity(intent3);

那么启动的是Own1Activity;如果Own1Activity不存在,那么启动的是OwnActivity。


最后,当我们通过隐式方式启动一个activity的时候,可以先做一下判断,这样就可规避隐式开启的错误了:

1.采用PackageManager的queryIntentActivity方法

public abstract List<ResolveInfo> queryIntentActivities(Intent intent,int flags);

2.采用PackageManager的resolveActivity方法或者Intent的resolveActivity方法

public abstract ResolveInfo resolveActivity(Intent intent, int flags);

Intent intent3 = new Intent();intent3.setAction("android.andong.second1");intent3.addCategory("android.andong.category");intent3.setDataAndType(Uri.parse("http://www.andong.com:8080/person"), "person/jpeg");if(null==intent3.resolveActivity(getPackageManager())){    Toast.makeText(this, "resolveActivity==null", Toast.LENGTH_SHORT).show();}else{    startActivity(intent3);}


0 0