防止Android程序被系统kill掉的处理方法

不念不忘少年蓝@ 2022-05-13 05:56 310阅读 0赞

转载请注明出处:http://blog.csdn.net/cuiran/article/details/38851401

目前遇到一个问题程序需要一直运行,并显示在最前端,但是运行一段时间发现会被系统Kill掉,这样程序就退出回到了桌面,不能实现一直运行的效果。为了实现此效果,也想了一些办法。如下:

1、可以将应用改为系统应用——由于程序需要定期更新,如果被放入系统应用,更新会非常麻烦,故没有采用。

2、在软件的onDestroy()方法中,发送重新启动应用的广播——如果程序是直接被kill掉 不会调用onDestroy方法(如果有发现应用被kill掉还会调用此方法,可以留言告知,非常感谢!)

3、新建一个Service,在后台服务定时去检测对应package是否在运行,若没有运行就发送广播告知。

为了实现效果程序同时实现2,3两种方式。

首先新建一个apk将级别改为系统应用,需要添加

android:sharedUserId=”android.uid.system”

在此apk中新建一个BroadcastReceiver用于接收重启程序的广播,收到广播会启动所需要运行的apk

然后在新建Service,在Service实现了对所需package是否运行和是否安装的检测,如果没有运行,再检测是否安装,若安装,会发送广播让其启动应用程序

  1. /**
  2. * CheckService.java
  3. * Copyright(C) 2014
  4. * creator:cuiran 2014-8-26 下午1:20:01
  5. */
  6. package com.xsdl.count.service;
  7. import java.util.List;
  8. import java.util.Timer;
  9. import java.util.TimerTask;
  10. import com.xsdl.count.receiver.Constants;
  11. import com.xsdl.count.util.LogsUtil;
  12. import android.annotation.SuppressLint;
  13. import android.app.ActivityManager;
  14. import android.app.Service;
  15. import android.content.Intent;
  16. import android.content.pm.PackageInfo;
  17. import android.content.pm.PackageManager;
  18. import android.content.pm.PackageManager.NameNotFoundException;
  19. import android.os.Handler;
  20. import android.os.IBinder;
  21. import android.os.Message;
  22. /**
  23. * 后台开启服务定时检测
  24. * @author cuiran
  25. * @version 1.0.0
  26. */
  27. public class CheckService extends Service {
  28. private static final String TAG="CheckService";
  29. private static final String ProcessName = "com.ghyf.mplay";
  30. @Override
  31. public IBinder onBind(Intent arg0) {
  32. return null;
  33. }
  34. /* (non-Javadoc)
  35. * @see android.app.Service#onCreate()
  36. */
  37. @Override
  38. public void onCreate() {
  39. LogsUtil.i(TAG, "检测服务启动---->>>> ");
  40. taskMail = new TimerTask() {
  41. @Override
  42. public void run() {
  43. Message message = new Message();
  44. message.what = 1;
  45. handlerMail.sendMessage(message);
  46. }
  47. };
  48. timerMail.schedule(taskMail, 15000, 5000);
  49. super.onCreate();
  50. }
  51. private final Timer timerMail = new Timer();
  52. private TimerTask taskMail;
  53. @SuppressLint("HandlerLeak")
  54. Handler handlerMail = new Handler() {
  55. @Override
  56. public void handleMessage(Message msg) {
  57. // 要做的事情
  58. try {
  59. boolean is=isBackgroundRunning();
  60. LogsUtil.i(TAG, "检测播控器 "+ProcessName+" is "+is);
  61. if(!is){
  62. /**
  63. * 发送广播通知应用启动
  64. */
  65. if(checkPackage()){
  66. Intent myIntent = new Intent(Constants.RESOFTWARE_RECEIVER);
  67. myIntent.putExtra("path","test");
  68. myIntent.setAction(Constants.RESOFTWARE_RECEIVER);
  69. sendBroadcast(myIntent);
  70. }
  71. }
  72. } catch (Exception e) {
  73. e.printStackTrace();
  74. }
  75. }
  76. };
  77. ActivityManager activityManager=null;
  78. PackageManager packageManager=null;
  79. PackageInfo pi = null;
  80. /**
  81. * 检测package是否存在<br>
  82. * 2014-8-26 下午3:58:49
  83. * @return
  84. *
  85. */
  86. public boolean checkPackage() {
  87. boolean flag=false;
  88. packageManager = getPackageManager();
  89. try {
  90. pi = packageManager.getPackageInfo(ProcessName, 0);
  91. if(null!=pi){
  92. flag=true;
  93. }
  94. } catch (NameNotFoundException e) {
  95. flag=false;
  96. LogsUtil.e(TAG, "出现异常", e);
  97. }
  98. return flag;
  99. }
  100. /**
  101. * 检测package是否在运行<br>
  102. * 2014-8-26 下午3:58:49
  103. * @return
  104. *
  105. */
  106. private boolean isBackgroundRunning() {
  107. activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
  108. if (activityManager == null) return false;
  109. // get running tasks processes
  110. List<ActivityManager.RunningTaskInfo> processList = activityManager.getRunningTasks(100);
  111. for (ActivityManager.RunningTaskInfo info : processList) {
  112. if (info.topActivity.getPackageName().startsWith(ProcessName)) {
  113. return true;
  114. }
  115. }
  116. return false;
  117. }
  118. /* (non-Javadoc)
  119. * @see android.app.Service#onDestroy()
  120. */
  121. @Override
  122. public void onDestroy() {
  123. try {
  124. /**
  125. * 释放资源
  126. */
  127. if(taskMail!=null){
  128. taskMail.cancel();
  129. }
  130. if(timerMail!=null){
  131. timerMail.cancel();
  132. }
  133. } catch (Exception e) {
  134. LogsUtil.e(TAG, "出现异常", e);
  135. }
  136. super.onDestroy();
  137. }
  138. }

启动应用程序可以采用如下两种方式:

第一种是直接通过Android的startActivity

  1. public void openCLD(String packageName,Context context) {
  2. PackageManager packageManager = context.getPackageManager();
  3. PackageInfo pi = null;
  4. try {
  5. pi = packageManager.getPackageInfo(packageName, 0);
  6. } catch (NameNotFoundException e) {
  7. LogsUtil.e("pi", "出现异常", e);
  8. }
  9. Intent resolveIntent = new Intent(Intent.ACTION_MAIN, null);
  10. resolveIntent.addCategory(Intent.CATEGORY_LAUNCHER);
  11. resolveIntent.setPackage(pi.packageName);
  12. List<ResolveInfo> apps = packageManager.queryIntentActivities(resolveIntent, 0);
  13. ResolveInfo ri = apps.iterator().next();
  14. if (ri != null ) {
  15. String className = ri.activityInfo.name;
  16. Intent intent = new Intent(Intent.ACTION_MAIN);
  17. intent.addCategory(Intent.CATEGORY_LAUNCHER);
  18. ComponentName cn = new ComponentName(packageName, className);
  19. intent.setComponent(cn);
  20. context.startActivity(intent);
  21. }
  22. }

第二种是通过执行命令 am start package/package.Activity这种方式启动。

发表评论

表情:
评论列表 (有 0 条评论,310人围观)

还没有评论,来说两句吧...

相关阅读