赞
踩
提到隐式意图:首先应想到显示意图,也就是我们开发中常用的。
显示意图一般是打开本应用自己的界面使用;而隐式意图则是打开其他应用的界面,例如分享,打开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); }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。