android应用管理器杀死进程,Android编程防止进程被第三方软件杀死的方法

本文详细介绍了如何在Android编程中防止服务被第三方清理软件如360手机助手、腾讯手机管家结束。通过使用ForegroundService并创建一个不被清除的通知,可以确保服务持续运行。即使通知被关闭,服务仍然可以保持运行状态,从而避免程序异常。这种方法在小米系统自带的进程管理中也有效。文章提供了完整的代码示例,帮助开发者实现这一功能。
摘要由CSDN通过智能技术生成

本文实例讲述了Android编程防止进程被第三方软件杀死的方法。分享给大家供大家参考,具体如下:

项目测试的时候发现,按home键回到桌面,再用360清理内存,软件被结束,再次进入的时候报错,看了下log,以为是有的地方没有控制好,但是又不知道360结束的是什么(这个现在还没弄明白)。使用小米系统的进程管理优化内存就不报错。

后来想到用Service防止软件被kill掉,查了下资料,发现google 管方就有,ForegroundService 前台服务,让服务一直以前台任务的方式运行,可以在service 的oncreate来实现前台服务, 通过这个方法必须发送一个通知栏,让用户知道服务在运行。

Notification notification = new Notification(R.drawable.icon, "服务开启", System.currentTimeMillis());

notification.flags|= Notification.FLAG_NO_CLEAR;

notification.flags=Notification.FLAG_ONGOING_EVENT;

Intent notificationIntent = new Intent(this, MainActivity.class);

PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);

notification.setLatestEventInfo(this, "service", "防止服务被任务管理器所杀", pendingIntent);

startForeground(ONGOING_NOTIFICATION, notification);

这样就能保持service 运行,可是通知栏不能清除 ,一清除就会被kill。

后来一次 做自定义Notification的时候,通知栏没有显示通知,查看后发现 service 也没被kill 。所以就进一步去研究了下 最后发现 只用两行代码就能保持服务不会被kill,并且不会有通知栏通知代码如下:

Notification notification = new Notification();

startForeground(1, notification);

完整代码如下:

public class TestService extends Service {

private static final Class[] mStartForegroundSignature = new Class[] {

int.class, Notification.class };

private static final Class[] mStopForegroundSignature = new Class[] { boolean.class };

private NotificationManager mNM;

private Method mStartForeground;

private Method mStopForeground;

private Object[] mStartForegroundArgs = new Object[2];

private Object[] mStopForegroundArgs = new Object[1];

@Override

public IBinder onBind(Intent intent) {

return null;

}

@Override

public void onCreate() {

super.onCreate();

mNM = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

try {

mStartForeground = TestService.class.getMethod("startForeground",

mStartForegroundSignature);

mStopForeground = TestService.class.getMethod("stopForeground",

mStopForegroundSignature);

} catch (NoSuchMethodException e) {

mStartForeground = mStopForeground = null;

}

// 我们并不需要为 notification.flags 设置 FLAG_ONGOING_EVENT,因为

// 前台服务的 notification.flags 总是默认包含了那个标志位

Notification notification =new Notification();

// 注意使用 startForeground ,id 为 0 将不会显示 notification

startForegroundCompat(1, notification);

}

@Override

public void onDestroy() {

super.onDestroy();

stopForegroundCompat(1);

}

// 以兼容性方式开始前台服务

private void startForegroundCompat(int id, Notification n) {

if (mStartForeground != null) {

mStartForegroundArgs[0] = id;

mStartForegroundArgs[1] = n;

try {

mStartForeground.invoke(this, mStartForegroundArgs);

} catch (IllegalArgumentException e) {

e.printStackTrace();

} catch (IllegalAccessException e) {

e.printStackTrace();

} catch (InvocationTargetException e) {

e.printStackTrace();

}

return;

}

mNM.notify(id, n);

}

// 以兼容性方式停止前台服务

private void stopForegroundCompat(int id) {

if (mStopForeground != null) {

mStopForegroundArgs[0] = Boolean.TRUE;

try {

mStopForeground.invoke(this, mStopForegroundArgs);

} catch (IllegalArgumentException e) {

e.printStackTrace();

} catch (IllegalAccessException e) {

e.printStackTrace();

} catch (InvocationTargetException e) {

e.printStackTrace();

}

return;

}

// 在 setForeground 之前调用 cancel,因为我们有可能在取消前台服务之后

// 的那一瞬间被kill掉。这个时候 notification 便永远不会从通知一栏移除

mNM.cancel(id);

}

}

经测试,360手机助手,腾讯手机管家都不能kill这个service,但是手动结束后,再次打开发现音频还在播放(跟音频有关的客户端),感觉有点小别扭

希望本文所述对大家Android程序设计有所帮助。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值