http://blog.csdn.net/huxueyan521/article/details/8921976html
作一个应用,须要强制关闭进程。 java
能够使用ActivityManager的killBackgroundProcesses方法,须要权限android.permission.KILL_BACKGROUND_PROCESSES。但使用此方法杀死进程后,进程会重启。源码中解释以下: android
Have the system immediately kill all background processes associated with the given package. This is the same as the kernel killing those processes to reclaim memory; the system will take care of restarting these processes in the future as needed. app
为了强制关闭进程,但愿使用ActivityManager的另一个方法,forceStopPackage。源码中解释以下: ide
Have the system perform a force stop of everything associated with the given application package. All processes that share its uid will be killed, all services it has running stopped, all activities removed, etc. In addition, a {@link Intent#ACTION_PACKAGE_RESTARTED} broadcast will be sent, so that any of its registered alarms can be stopped, notifications removed, etc. ui
使用这个方法有两点须要注意: this
- 此方法是@hide的方法: spa
解决方案是使用java的反射机制完成调用,代码以下: .net
ActivityManager mActivityManager = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE);
Method method = Class.forName("android.app.ActivityManager").getMethod("forceStopPackage", String.class);
method.invoke(mActivityManager, packageName); //packageName是须要强制中止的应用程序包名 rest
- 此方法须要权限:android.permission.FORCE_STOP_PACKAGES
下面着手分析这个权限。
这个权限在frameworks/base/core/res/AndroidManifest.xml文件中声明,以下:
android:permissionGroup="android.permission-group.SYSTEM_TOOLS"
android:protectionLevel="signature"
android:label="@string/permlab_forceStopPackages"
android:description="@string/permdesc_forceStopPackages"/>
注意protectionLevel属性值未signature。看sdk文档 http://developer.android.com/guide/topics/manifest/permission- element.html#plevel中对这一属性的解释以下:
A permission that the system grants only if the requesting application is signed with the same certificate as the application that declared the permission. If the certificates match, the system automatically grants the permission without notifying the user or asking for the user's explicit approval.
意思是:app使用FORCE_STOP_PACKAGES权限,app必须和这个权限的声明者的签名保持一致!
FORCE_STOP_PACKAGES的声明者是frameworks/base/core/res/,能够在frameworks/base/core/res/Android.mk中看到它的签名信息:
LOCAL_NO_STANDARD_LIBRARIES := true
LOCAL_PACKAGE_NAME := framework-res
LOCAL_CERTIFICATE := platform
即,签名为platform.
最终获得结论,app须要是platform签名,才能够使用forceStopPackage方法!
网上有不少文章说起,须要在app的AndroidManifest.xml中添加 android:sharedUserId="android.uid.system"一句话。看 sdk(http://developer.android.com/guide/topics/manifest/manifest- element.html)对此的解释:
android:sharedUserId The name of a Linux user ID that will be shared with other applications. By default, Android assigns each application its own unique user ID. However, if this attribute is set to the same value for two or more applications, they will all share the same ID — provided that they are also signed by the same certificate. Application with the same user ID can access each other's data and, if desired, run in the same process.
意思是,两个app使用了相同的user id,就能够互相访问对方的数据。所以,app使用android.uid.system的user id,就能够访问系统数据。注意背景为黄色的一句,这里依然须要两个app有相同的签名才行。