使用ActivityManager的forceStopPackage方法结束进程
来源:互联网 发布:可靠性软件北京 编辑:程序博客网 时间:2024/04/27 20:01
做一个应用,需要强制关闭进程。
可以使用ActivityManager的killBackgroundProcesses方法,需要权限android.permission.KILL_BACKGROUND_PROCESSES。但使用此方法杀死进程后,进程会重启。源码中解释如下:
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.
为了强制关闭进程,希望使用ActivityManager的另外一个方法,forceStopPackage。源码中解释如下:
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.
使用这个方法有两点需要注意:
- 此方法是@hide的方法:
解决方案是使用java的反射机制完成调用,代码如下:
ActivityManager mActivityManager = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE);Method method = Class.forName("android.app.ActivityManager").getMethod("forceStopPackage", String.class);method.invoke(mActivityManager, packageName); //packageName是需要强制停止的应用程序包名
- 此方法需要权限:android.permission.FORCE_STOP_PACKAGES
下面着手分析这个权限。
这个权限在frameworks/base/core/res/AndroidManifest.xml文件中声明,如下:
<permission android:name="android.permission.FORCE_STOP_PACKAGES" 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 := trueLOCAL_PACKAGE_NAME := framework-resLOCAL_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.
- 使用ActivityManager的forceStopPackage方法结束进程
- 使用ActivityManager的forceStopPackage方法结束进程
- 【转】使用ActivityManager的forceStopPackage方法结束进程
- Android2.2 结束进程forceStopPackage()
- Android 通过反射调用隐蔽方法forceStopPackage结束应用
- 结束进程的方法
- Android怎么结束一个进程,我试了用 ActivityManager.killBackgroundProcesses方法去结束,但是没有反应
- Android 结束进程的方法
- Symbian结束进程的方法
- Android 结束进程的方法
- Android 结束进程的方法
- Android 结束进程的方法
- VC++结束进程的方法
- Android 结束进程的方法
- Android 结束进程的方法
- Android 结束进程的方法
- Android 结束进程的方法
- Android结束进程的方法
- java学习小技巧
- 字符串的拆分(componentsSeparatedByCharactersInSet)
- 局部敏感哈希算法的实现
- System类
- 图的深度优先搜索与广度优先搜索
- 使用ActivityManager的forceStopPackage方法结束进程
- 教你1分钟学会傻瓜式的GitHub项目托管
- 两分钟学会在GitHub托管代码
- Spring框架中,AOP编程循序渐进-笔记
- ThreadLocal<T> 与线程封闭
- Effulgent的《深入理解Direct3D9》整理版
- hdu 3666 THE MATRIX PROBLEM【差分约束系统】
- 集体智慧常用算法
- 2013蓝桥杯Java本科预赛B组(1)