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

首頁 > 系統 > Android > 正文

Android檢測Activity或者Service是否運行的方法

2019-10-22 18:14:02
字體:
來源:轉載
供稿:網友

需求:假設我們的APP有3個頁面AActivity,BActivity,CActivity,我們的APP需要一直運行在前臺(特殊設備),要求實現一個監控服務,來監視APP是否運行,如果有3個頁面都不運行了就說明這個APP已經掛掉了,否則說明APP在運行狀態,不做處理,掛掉之后,我們需要重新啟動App來讓它繼續處理運行狀態,對外暴露一個來停止監控服務的廣播,這樣我們想停止監控服務時,發送一個廣播即可。

思路:實現一個雙進程的監控服務,服務中寫一個定時器 Timer 來重復進行檢測是否正在運行,如果否就直接重新啟動APP。

1.定義一個監控服務

package com.anloq.nfcservice;import android.app.Service;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.content.IntentFilter;import android.os.IBinder;import android.util.Log;import com.anloq.MyApplication;import com.anloq.activity.AdActivity;import com.anloq.utils.DetectionASUtils;import java.text.SimpleDateFormat;import java.util.Date;import java.util.Locale;import java.util.Timer;import java.util.TimerTask;/** * Created by xpf on 2017/6/3 :) * 檢測APP頁面是否一直運行,不運行就直接啟動 */public class MonitoringService extends Service { private final static String TAG = "MonitoringService"; private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {  @Override  public void onReceive(Context context, Intent intent) {   if ("kill_self".equals(intent.getAction())) {    Log.e(TAG, "onReceive:殺死自己的進程!");    killMyselfPid(); // 殺死自己的進程   }  } }; private Timer timer = new Timer(); private TimerTask task = new TimerTask() {  @Override  public void run() {   checkIsAlive();  } }; /**  * 檢測應用是否活著  */ private void checkIsAlive() {  String format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss",    Locale.CHINA).format(new Date());  Log.e(TAG, "CustodyService Run: " + format);  boolean AIsRunning = CheckUtil.isClsRunning(    MonitoringService.this, "com.xpf.monitor", "com.xpf.monitor.activity.AActivity");  boolean BIsRunning = CheckUtil.isClsRunning(    MonitoringService.this, "com.xpf.monitor", "com.xpf.monitor.activity.BActivity");  boolean b = (AIsRunning || BIsRunning);  boolean CIsRunning = CheckUtil.isClsRunning(    MonitoringService.this, "com.xpf.monitor", "com.xpf.monitor.activity.CActivity");  Log.e(TAG, "AIsRunning || BIsRunning is running:" + b + ",CIsRunning:" + CIsRunning);  if (!CIsRunning) {   if (!b) { //如果界面掛掉直接啟動AActivity    Intent intent = new Intent();    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);    intent.setClass(MonitoringService.this, AActivity.class);    startActivity(intent);   }  } } @Override public void onCreate() {  super.onCreate();  Log.e(TAG, "onCreate: 啟動監控服務! ");  IntentFilter intentFilter = new IntentFilter();  intentFilter.addAction("kill_self");  registerReceiver(broadcastReceiver, intentFilter);  timer.schedule(task, 0, 10000);// 設置檢測的時間周期(毫秒數) } @Override public int onStartCommand(Intent intent, int flags, int startId) {  return START_STICKY; } @Override public IBinder onBind(Intent arg0) {  return null; } /**  * 殺死自身的進程  */ private void killMyselfPid() {  int pid = android.os.Process.myPid();  String command = "kill -9 " + pid;  Log.e(TAG, "killMyselfPid: " + command);  stopService(new Intent(MonitoringService.this, MonitoringService.class));  try {   Runtime.getRuntime().exec(command);   System.exit(0);  } catch (Exception e) {   e.printStackTrace();  } } @Override public void onDestroy() {  super.onDestroy();  unregisterReceiver(broadcastReceiver);  if (task != null) {   task.cancel();  }  if (timer != null) {   timer.cancel();  } }}

2.注冊雙進程Service

  <service   android:name="com.xpf.monitor.MonitoringService"   android:enabled="true"   android:label="MonitoringService"   android:process=":gray">   <intent-filter>    <action android:name="android.intent.action.RESPOND_VIA_MESSAGE" />   </intent-filter>  </service>

3.檢測是否活著的工具類CheckUtil

public class CheckUtil { //檢測service是否在運行 public static boolean isServiceWorked(Context context, String serviceName) {  ActivityManager myManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);  ArrayList<ActivityManager.RunningServiceInfo> runningService = (ArrayList<ActivityManager.RunningServiceInfo>) myManager.getRunningServices(Integer.MAX_VALUE);  for (int i = 0; i < runningService.size(); i++) {   if (runningService.get(i).service.getClassName().toString().equals(serviceName)) {    return true;   }  }  return false; } //檢測activity是否存在再棧頂 public static boolean isForeground(Context context, String PackageName) {  ActivityManager myManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);  List<ActivityManager.RunningTaskInfo> task = myManager.getRunningTasks(1);  ComponentName componentInfo = task.get(0).topActivity;  if (componentInfo.getPackageName().equals(PackageName))   return true;  return false; } /**  * 判斷某個app進程是否在運行  *  * @param context  * @param appInfo  * @return  */ public static boolean isRunningProcess(Context context, String appInfo) {  ActivityManager myManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);  List<ActivityManager.RunningAppProcessInfo> runningAppPs = myManager.getRunningAppProcesses();  if (runningAppPs != null && runningAppPs.size() > 0) {   if (runningAppPs.contains(appInfo)) {    return true;   }  }  return false; } /**  * 判斷一個Activity是否正在運行  *  * @param pkg  pkg為應用包名  * @param cls  cls為類名eg  * @param context  * @return  */ public static boolean isClsRunning(Context context, String pkg, String cls) {  ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);  List<ActivityManager.RunningTaskInfo> tasks = am.getRunningTasks(1);  ActivityManager.RunningTaskInfo task = tasks.get(0);  if (task != null) {   return TextUtils.equals(task.topActivity.getPackageName(), pkg) &&     TextUtils.equals(task.topActivity.getClassName(), cls);  }  return false; }}

4.MainActivity中啟動監控服務

 Intent intent = new Intent(MainActivity.this, MonitoringService.class); intent.setAction("android.intent.action.RESPOND_VIA_MESSAGE"); startService(intent);

5.停止監控服務

發送一個殺死進程廣播即可,action值如下

 Intent intent = new Intent(); intent.setAction("kill_self"); sendOrderedBroadcast(intent, null);

好了,今天就分享到這里了。。。

以上這篇Android檢測Activity或者Service是否運行的方法就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 固安县| 双鸭山市| 杭锦后旗| 辽阳市| 靖州| 江达县| 阿城市| 若羌县| 怀化市| 湟中县| 威海市| 滕州市| 阜宁县| 邮箱| 梓潼县| 辉县市| 石泉县| 谢通门县| 洪湖市| 云和县| 靖安县| 东方市| 正蓝旗| 威海市| 友谊县| 巨野县| 彭州市| 建水县| 沿河| 视频| 昌黎县| 永寿县| 株洲县| 遂昌县| 衡东县| 曲靖市| 抚松县| 农安县| 泗洪县| 克东县| 乌什县|