博客源址:AndroidManifest详解之Application(有图更好懂)
博客时间:2014-06-11 16:34
- <activity>
- <activity-alias>
- <service>
- <receiver>
- <provider>
- <uses-library>
常用的属性:
android:process
默认情况下,Android为每个应用程序创建一个单独的进程,所有组件运行在该进程中,这个默认进程的名字通常与该应用程序的包名相同。比如
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.lt.mytest" >
设置该属性可以使得本应用程序与其它应用程序共享相同的进程,仅仅当这两个应用程序也共享一个拥有相同签名的UserId。
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- android:sharedUserId="android.uid.phone" >
主要代码:
- <activity android:name=".ActivityA"
- android:launchMode="standard"
- android:label="@string/title_activityA">
- <intent-filter>
- <action android:name="com.leaves.ipanel.ActivityA"/>
- <category android:name="android.intent.category.DEFAULT"/>
- </intent-filter>
- </activity>
- public void onClick(View arg0) {
- // TODO Auto-generated method stub
- Log.i(TAG, "--onClick--task id = " + getCurrentTaskId());
- Intent intent = new Intent("com.leaves.ipanel.ActivityA");
- startActivity(intent);
- }
- public void onClick(View arg0) {
- // TODO Auto-generated method stub
- Log.i(TAG, "--onClick--task id = " + getCurrentTaskId());
- Intent intent = new Intent("com.leaves.ipanel.ActivityA");
- intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- startActivity(intent);
- }
3、无FLAG_ACTIVITY_NEW_TASK有taskAffinity (不同于MainActivity)
- <activity android:name=".ActivityA"
- android:launchMode="standard"
- android:taskAffinity="com.leaves.test.ActivityA"
- android:label="@string/title_activityA">
- <intent-filter>
- <action android:name="com.leaves.ipanel.ActivityA"/>
- <category android:name="android.intent.category.DEFAULT"/>
- </intent-filter>
- </activity>
- public void onClick(View arg0) {
- // TODO Auto-generated method stub
- Log.i(TAG, "--onClick--task id = " + getCurrentTaskId());
- Intent intent = new Intent("com.leaves.ipanel.ActivityA");
- startActivity(intent);
- }
4、有FLAG_ACTIVITY_NEW_TASK有taskAffinity
把FLAG_ACTIVITY_NEW_TASK添加上去
- public void onClick(View arg0) {
- // TODO Auto-generated method stub
- Log.i(TAG, "--onClick--task id = " + getCurrentTaskId());
- Intent intent = new Intent("com.leaves.ipanel.ActivityA");
- intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- startActivity(intent);
- }
查看一下启动A之后的堆栈:
上面我们测试的两个Activity是在同一个应用中,如果他们在不同的应用中呢,例如ActivityA跟MainActivity不在一个apk中,其实情况还是一样的.因为默认如果没有设置taskAffinity,则taskAffinity跟包名是一样的。若不考虑android:allowTaskReparenting,如果ActivityA跟MainActivity不在一个apk中,当没有FLAG_ACTIVITY_NEW_TASK时,则两者应该是在同一个task,但是如果有FLAG_ACTIVITY_NEW_TASK,则两者应该会在不同的task中。
android:allowTaskReparenting
主要作用是activity的迁移,即从一个task迁移到另一个task,这个迁移跟activity的taskAffinity有关,必须是将该activity从旧的 taskAffinity迁移到新的taskAffinity中.只有设置了FLAG_ACTIVITY_RESET_TASK_IF_NEEDED标识才会用到该属性。从home上启动的程序都会设置该Flag,会进行task reset.
下面举个例子,有两个apk
首先我们启动apk2,进入MainActivityB,点击MainActivityB会进入ActivityB, 按home键,再从Home键启动apk1,用dumpsys工具得到这个时候的堆栈:
图中蓝色线框部分表示对应的Activity所属的task