第一种方式:
知道要跳转的第三方应用的包名和要跳转到的activity的名字,得用
Intent intent = new Intent();
ComponentName component = new ComponentName(包名,要跳转的activity路径);
intent.setComponent(component );
或
intent.setClass(包名,要跳转的activity路径);
startActivity(intent);
第二种通过在AndroidManifest.xml中定义的action进行隐式跳转。
第三种方式通过AndroidManifest.xml中定义的<data>来进行跳转。
例如:
在AndroidManifest.xml中定义了一个DetailActivity
<activity android:launchMode="singleTask" android:name="com.example.movie.DetailActivity" android:theme="@style/Theme.NoTitleBar">
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.BROWSABLE"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:host="view" android:scheme="movieapp" android:port="80"/>
</intent-filter>
</activity>
这种跳转方式的url是scheme://host:port/parth:
Intent intent = new Intent("com.example.movie");
intent.setData(Uri.parse("movieapp://view:80/parth"));
startActivity(intent);
如果要传递参数的话可以写成Uri.parse("movieapp://view/parth?mediaId="+mediaId);
对于intent-filter的详细解释如下表:
先解释一下显示intent和隐式intent,
- 显式intent是指明确指出此intent是启动哪个activity.
- 隐式intent是指并没有指出要启动哪个activity,而要系统自动去判断并启动匹配的activity.
上面我们讲了隐式intent是要靠系统自动去匹配并启动某个activity的。那系统是怎样匹配activity的呢,系统是怎样知道这个actitiy就是某个intent想要的呢。
某个activity能不能被某个intent激活,要看这个activity是不是符合这个intent的要求,而某个activity能被哪个intent激活是有定义的,定义就在AndroidManifest.xml的<intent-filter>中。
在<intent-filter>里有以下几个属性可以让intent来匹配:Action、Category、Data;下面逐一介绍:
1、Action:该activity可以执行的动作
该标识用来说明这个activity可以执行哪些动作,所以当隐式intent传递过来action时,如果跟这里<intent-filter>所列出的任意一个匹配的话,就说明这个activity是可以完成这个intent的意图的,可以将它激活!!!!
常用的Action如下所示:
ACTION_CALL activity 启动一个电话.
ACTION_EDIT activity 显示用户编辑的数据.
ACTION_MAIN activity 作为Task中第一个Activity启动
ACTION_SYNC activity 同步手机与数据服务器上的数据.
ACTION_BATTERY_LOW broadcast receiver 电池电量过低警告.
ACTION_HEADSET_PLUG broadcast receiver 插拔耳机警告
ACTION_SCREEN_ON broadcast receiver 屏幕变亮警告.
ACTION_TIMEZONE_CHANGED broadcast receiver 改变时区警告
两条原则:
一条<intent-filter>元素至少应该包含一个<action>,否则任何Intent请求都不能和该<intent-filter>匹配。
如果Intent请求的Action和<intent-filter>中个任意一条<action>匹配,那么该Intent就可以激活该activity(前提是除了action的其它项也要通过)。
两条注意:
如果Intent请求或<intent-filter>中没有说明具体的Action类型,那么会出现下面两种情况。
如果<intent-filter>中没有包含任何Action类型,那么无论什么Intent请求都无法和这条<intent-filter>匹配。
反之,如果Intent请求中没有设定Action类型,那么只要<intent-filter>中包含有Action类型,这个Intent请求就将顺利地通过<intent-filter>的行为测试。
2、Category:于指定当前动作(Action)被执行的环境
即这个activity在哪个环境中才能被激活。不属于这个环境的,不能被激活。
常用的Category属性如下所示:
CATEGORY_DEFAULT:Android系统中默认的执行方式,按照普通Activity的执行方式执行。表示所有intent都可以激活它
CATEGORY_HOME:设置该组件为Home Activity。
CATEGORY_PREFERENCE:设置该组件为Preference。
CATEGORY_LAUNCHER:设置该组件为在当前应用程序启动器中优先级最高的Activity,通常为入口ACTION_MAIN配合使用。
CATEGORY_BROWSABLE:设置该组件可以使用浏览器启动。表示该activity只能用来浏览网页。
CATEGORY_GADGET:设置该组件可以内嵌到另外的Activity中
一个intent对象可以有任意个category。intent类定义了许多category常数.
addCategory()方法为一个intent对象增加一个category,
removeCategory删除一个category,
getCategories()获取intent所有的category.
注意:
如果该activity想要通过隐式intent方式激活,那么不能没有任何category设置,至少包含一个android.intent.category.DEFAULT
3、Data 执行时要操作的数据
在目标<data/>标签中包含了以下几种子元素,他们定义了url的匹配规则:
android:scheme 匹配url中的前缀,除了“http”、“https”、“tel”...之外,我们可以定义自己的前缀
android:host 匹配url中的主机名部分,如“google.com”,如果定义为“*”则表示任意主机名
android:port 匹配url中的端口
android:path 匹配url中的路径
注意:
这个标识比较特殊,它定义了执行此Activity时所需要的数据,也就是说,这些数据是必须的!!!!!所有如果其它条件都足以激活该Activity,但intent却没有传进来指定类型的Data时,就不能激活该activity!!!!
像上文中的例子,
<activity android:launchMode="singleTask" android:name="com.example.movie.DetailActivity" android:theme="@style/Theme.NoTitleBar">
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.BROWSABLE"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:host="view" android:scheme="movieapp" android:port="80"/>
</intent-filter>
</activity>
这个activity既定义了action也定义了data
这个时候如果要启动这个DetailActivity只指定action就不够了,我们需要为其设置data值,如下:
Intent intent = new Intent("android.intent.action.VIEW");
intent.setData(Uri.parse("movieapp://view:80/target"));
startActivity(intent);
4、Extras
这个参数不参与匹配activity,而仅作为额外数据传送到另一个activity中,接收的activity可以将其取出来。这些信息并不是激活这个activity所必须的。也就是说激活某个activity与否只上action、data、catagory有关,与extras无关。而extras用来传递附加信息,诸如用户名,用户密码什么的。
可通过putXX()和getXX()方法存取信息;也可以通过创建Bundle对象,再通过putExtras()和getExtras()方法来存取。
通过bundle对象传递
本文部分内容转载自:https://blog.csdn.net/harvic880925/article/details/38399723