一 WHAT?
就是让不同的应用程序共享一个进程。这篇文章纯粹是API Guids里一段话的注脚:
You can also set android:process
so that components of different applications run in the same process—provided that the applications share the same Linux user ID and are signed with the same certificates.
http://developer.android.com/guide/components/processes-and-threads.html
二 HOW?
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.allenffl.helloworld"
android:versionCode="1"
android:versionName="1.0"
android:sharedUserId="com.allen.ffl" >
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.allenffl.aidlserver"
android:versionCode="1"
android:versionName="1.0"
android:sharedUserId="com.allen.ffl"
>
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="19" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme"
android:process="com.allenffl.helloworld" >
两个应用打包使用同一个key:HelloWorldKey.生成相同的数字签名:
AIDLServer.apk
MD5 : FE:00:35:B0:D9:87:6F:7B:D7:A6:95:D7:12:3D:0C:9F
SHA1: FA:DF:96:82:74:AC:4E:E1:5E:39:D8:B0:D2:AF:48:23:34:42:E2:AD
HelloWorld.apk
MD5 : FE:00:35:B0:D9:87:6F:7B:D7:A6:95:D7:12:3D:0C:9F
SHA1: FA:DF:96:82:74:AC:4E:E1:5E:39:D8:B0:D2:AF:48:23:34:42:E2:AD
注意:直接在adt里往模拟器或真机运行也可以,是因为bin目录下的apk默认采用了debug签名,两个apk采用的key都是
/Documents and Settings/liuhua/.Android/debug.keystore,其中的liuhua是你电脑的用户名
为了验证这两个应用跑在一个进程里,我们另开一个activity查看进程:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState == null) {
getFragmentManager().beginTransaction()
.add(R.id.container, new PlaceholderFragment()).commit();
}
//查看进程 两个apk 共享一个进程
ActivityManager am = (ActivityManager)getSystemService(ACTIVITY_SERVICE);
List<RunningAppProcessInfo> processes = am.getRunningAppProcesses();
for (RunningAppProcessInfo processInfo:processes) {
if (processInfo.processName.equals("com.allenffl.helloworld")) {
System.out.println(processInfo.processName+"--uid-"+processInfo.uid+"---");
}
}
//查看安装包 同一个进程里跑了几个包
PackageManager pm = getPackageManager();
String[] packagesForUid = pm.getPackagesForUid(10112);
for (int i = 0; i < packagesForUid.length; i++) {
System.out.println(packagesForUid[i]);
}
try {
PackageInfo packageInfo = pm.getPackageInfo("com.allenffl.aidlserver", PackageManager.GET_SERVICES);
System.out.println("aidlserver-sharedUserId-"+packageInfo.sharedUserId);
PackageInfo packageInfo2 = pm.getPackageInfo("com.allenffl.helloworld", PackageManager.GET_SERVICES);
System.out.println("helloworld-sharedUserId-"+packageInfo2.sharedUserId);
} catch (NameNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
输出结果:
05-25 18:15:22.175: I/System.out(15627): com.allenffl.helloworld--uid-10112---
05-25 18:15:22.175: I/System.out(15627): com.allenffl.aidlserver
05-25 18:15:22.175: I/System.out(15627): com.allenffl.helloworld
05-25 18:15:22.175: I/System.out(15627): aidlserver-sharedUserId-com.allen.ffl
05-25 18:15:22.175: I/System.out(15627): helloworld-sharedUserId-com.allen.ffl
三 WHY?
这样做的好处在于,轻松实现了两个应用的数据共享。
参考资料:
【AndroidManifest.xml详解】Manifest属性之sharedUserId、sharedUserLabel
http://blog.csdn.net/wirelessqa/article/details/8581652
Android通过共享用户ID来实现多Activity进程共享
http://mypyg.iteye.com/blog/720406