我目前做的一个应用为了保护用户隐私,不允许在setting中将service停掉,也不允许通过第三方应用将应用kill掉,如果说service被停掉,或是应用被kill掉,则立即重启service,请问有什么方法或是思路实现么?ps:如果在杀掉应用 或是停掉service的时候,能截获到这个操作么?
解决方案 »
- Error generating final archive怎么解决
- 初学Android,请教handler.removeCallbacks的问题
- 代码生成的TextView怎样设置样式
- 【求助】自定义ScrollLayout中动态添加GridView,无法更新数据问题
- 这几天在开发android2.3 蓝牙的程序,遇到如下问题
- android如何从服务器上循环解析图片
- 曾有JAVA基础.现自学Android开发.可以吗?
- 智能手机对蓝牙操作有多大的控制自由度?
- 怎么修改ListView SimpleAdapter里面的TextView的颜色
- 日期格式的解析问题
- android怎样连接oracle数据库??求源代码
- 文档中说什么呢
public void forceStopPackage(final String packageName) {
if (checkCallingPermission(android.Manifest.permission.FORCE_STOP_PACKAGES)
!= PackageManager.PERMISSION_GRANTED) {
String msg = "Permission Denial: forceStopPackage() from pid="
+ Binder.getCallingPid()
+ ", uid=" + Binder.getCallingUid()
+ " requires " + android.Manifest.permission.FORCE_STOP_PACKAGES;
Slog.w(TAG, msg);
throw new SecurityException(msg);
}
long callingId = Binder.clearCallingIdentity();
try {
IPackageManager pm = ActivityThread.getPackageManager();
int pkgUid = -1;
synchronized(this) {
try {
pkgUid = pm.getPackageUid(packageName);
} catch (RemoteException e) {
}
if (pkgUid == -1) {
Slog.w(TAG, "Invalid packageName: " + packageName);
return;
}
//begin:加入一个判断条件
if (packageName.equals("你的进程名")) {
return;
}
//end: 加入一个判断条件 forceStopPackageLocked(packageName, pkgUid);
}
} finally {
Binder.restoreCallingIdentity(callingId);
}
}
};这样的话在任务管理器里可以保证KISS不掉的;
还有在这个方法上还有个方法clearApplicationUserData中保证如果是该进程就不让调用forceStopPackage()方法;
如果修改framework的话,的确可以通过对包名的过滤来实现。居于应用层开发,有什么实现方法或是思路么?
比如在kill的时候,会不会触发某一个广播?
这个貌似必须改framework层,如果在应用层进行处理的话,除非单独起一个线程,不停的检测该service的运行状况,如果被kill掉了就另起一个。
这个需求最蛋疼的地方在于如果从DDMS里面直接kill掉这个service的话是不会触发service对应停止事件的。
虽然不是很完美,但从应用层的角度,这个问题总算解决了。
碰到这么蛋疼的问题,解决方案也真够蛋疼的,谁有什么好的解决方案,欢迎交流,如果目前的解决方案中有什么问题,欢迎批评指正哈。2.1版本
对于Taskkiller等第三方应用,在kill应用的时候,通过<action android:name="android.intent.action.PACKAGE_RESTARTED">捕捉广播,如果是自己的应用被kill掉,则重启service。
对于settings对运行的service进行stop操作,会触发onDestroy方法,在这里进行service的重启2.3.3版本
对于Taskkiller等第三方应用,在kill应用的时候,service居然TMD自己会重启(真TM蛋疼,反编译的代码,研究了老久也TMD没找到是怎么回事,最后还是通过版本对比才得出的结论)
对于settings当然还是采用以上方案啦
我之所以说不可能完美,是因为android系统的low memory killer 会“误杀” 应用层的一切为重启service作出的努力的。但是几率不是100% .
你这个貌似不行吧???
屏幕的关闭/解锁 和 杀掉app/service有关系么?
为啥我一直监听不到呢,文档上说:Note that the restarted package does not receive this broadcast.
被重启的包不能监听自己是否重启吧
...参考PC中的进程互锁, 两个service相互监控, 这个关了那个开.
你如果要该framework的话,至少需要从restartPackage和forceStopPackage两个方法分析,因为不同的操作,调用的是不同的入口。