显式启动
第一种,也是我们在开发中最为常用的:
Intent intent = new Intent(MainActivity.this, ThirdActivity.class); startActivity(intent);
第二种,不是很常用 (点击进入原地址):
ComponentName cn=new ComponentName("com.example.appreceiver", "com.example.appreceiver.MainActivity"); Intent intent = new Intent(); intent.setComponent(cn);
隐式启动
隐式启动 Activity 的 intent 到底发给哪个 activity,需要进行三个匹配,一个是 action,一个是 category,一个是 data。
1. 在 Manifest 中如果有 data, 那么在 intent 中,必须使用 setData 方法
假设在 Manifest 中一个 Activity 声明如下:
<activity android:name="cn.sumile.FourthActivity" > <intent -filter> <action android:name="www.sumile.cn"></action> <data android:scheme="sumile"></data> </intent> </activity>
就 data 节点来说,我们调用的时候必须有下面这一句:
intent.setData(uri);
而 uri 来自于下面的代码,里面的参数比 Manifest 中的只能多不能少
Uri uri=Uri.parse("sumile:haha");//这个可以 //Uri uri=Uri.parse("sumile");//这个不行 //Uri uri=Uri.parse("sumil");//这个不行
2. 关于 category
在 new Intent 之后,intent 中默认已经调用了
intent.addCategory(Intent.CATEGORY_APP_BROWSER);
所以如果 Manifest 中是如下代码的话
<activity android:name="cn.sumile.FourthActivity" > <intent-filter> <action android:name="www.sumile.cn" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
在 intent 中不用调用 addCategory 方法也可以。同时,如果 Manifest 中包括两个或多个 category 节点,那么 intent 中只要包括其中的一个就可以了,即如果 Manifest 在上面的基础上再添加
<category android:name="android.intent.category.APP_BROWSER" />
intent 还是不用调用 addCategory 方法,应为它默认已经包括了
intent.addCategory(Intent.CATEGORY_DEFAULT);
3. 有 data 的情况下,data 必须有,action 任意
假设 Manifest 中 data 节点,action 节点都有的话,那么 intent 的 setAction 方法和 setData 方法可以都有,也可以单独有 setData。
总结:
1. 如果 Manifest 中要有 data 节点,必须有 action 节点。
2. 在有 action 和 data 节点的时候,intent 中必须调用 setData 方法,调用不调用 setCategory 方法随意。
3.Manifest 中 category 节点的个数随意,但是 intent 中必须包含有 Manifest 中定义的节点中的一个(intent 中默认包含 default)。
4.action 节点可以包括多个,只要匹配到其中一个就可以打开,但是如果有其他的 Activity 也包括相同的 action 值,程序错误。
5. 最后调用的 setAction 的值,成为要去 Manifest 中匹配的值(这句好像是废话)
Activity 初步讲解请看:Activity 初探 1
测试代码下载转载请注明:热爱改变生活.cn » Activity 初探 2——Activity 的启动方式
本博客只要没有注明“转”,那么均为原创。 转载请注明链接:sumile.cn » Activity 初探 2——Activity 的启动方式