国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android編程防止進程被第三方軟件殺死的方法

2020-04-11 11:21:02
字體:
來源:轉載
供稿:網友

本文實例講述了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程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 普安县| 桂林市| 东台市| 墨玉县| 左权县| 宁陕县| 广宁县| 涡阳县| 会泽县| 邵武市| 绩溪县| 白河县| 高尔夫| 德惠市| 浠水县| 鄂州市| 苍山县| 淳安县| 福泉市| 夹江县| 神池县| 重庆市| 来宾市| 万安县| 关岭| 红安县| 共和县| 颍上县| 岑巩县| 揭阳市| 正安县| 六枝特区| 洞头县| 陆丰市| 邹城市| 新野县| 焉耆| 武邑县| 理塘县| 灯塔市| 宜昌市|