Android编程防止进程被第三方软件杀死的方法

作者:cc1218 时间:2021-08-01 01:52:46 

本文实例讲述了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程序设计有所帮助。

标签:Android,进程
0
投稿

猜你喜欢

  • Android实现调用震动的方法

    2021-10-03 19:33:24
  • C#实现QQ聊天窗口

    2023-07-06 02:43:56
  • 解析C#中@符号的几种使用方法详解

    2022-11-09 03:26:03
  • SpringBoot实现RAS+AES自动接口解密

    2022-11-05 04:07:01
  • SpringBoot整合POI导出通用Excel的方法示例

    2021-12-30 21:13:12
  • C#后端接收form-data,创建实体类教程

    2023-08-23 21:07:57
  • C# 获取系统进程的用户名

    2022-12-06 02:38:03
  • 基于SpringBoot实现图片上传及图片回显

    2023-01-17 06:26:15
  • C# 实现颜色渐变窗体控件详细讲解

    2021-12-31 07:10:28
  • Java中抽象类与方法的重写方式

    2023-08-25 09:20:29
  • 关于RedisTemplate之opsForValue的使用说明

    2023-07-09 16:53:04
  • 解决java 分割字符串成数组时,小圆点不能直接进行分割的问题

    2023-11-05 03:13:24
  • java并发编程专题(三)----详解线程的同步

    2022-03-18 05:35:42
  • Java的Swing编程中使用SwingWorker线程模式及顶层容器

    2021-09-09 08:45:06
  • 详解Java线程同步器CountDownLatch

    2023-08-23 18:42:39
  • java高并发之线程的基本操作详解

    2023-12-04 13:35:25
  • Java算法设计与分析分治算法

    2022-04-02 08:07:15
  • C#图片切割、图片压缩、缩略图生成代码汇总

    2022-01-20 07:51:26
  • Java京东面试题之为什么HashMap线程不安全

    2022-12-06 07:20:02
  • c# 实现轮询算法实例代码

    2023-01-30 03:48:51
  • asp之家 软件编程 m.aspxhome.com