欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2018年03月23日 09:08:12   作者:碼不停蹄子  
下面小編就為大家分享一篇Android檢測Activity或者Service是否運行的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

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

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

1.定義一個監(jiān)控服務(wù)

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();
  }
 };

 /**
  * 檢測應(yīng)用是否活著
  */
 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: 啟動監(jiān)控服務(wù)! ");
  IntentFilter intentFilter = new IntentFilter();
  intentFilter.addAction("kill_self");
  registerReceiver(broadcastReceiver, intentFilter);
  timer.schedule(task, 0, 10000);// 設(shè)置檢測的時間周期(毫秒數(shù))
 }

 @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為應(yīng)用包名
  * @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中啟動監(jiān)控服務(wù)

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

5.停止監(jiān)控服務(wù)

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

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

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

以上這篇Android檢測Activity或者Service是否運行的方法就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Android開發(fā)MediaCodec和lamemp3多段音頻截取拼接

    Android開發(fā)MediaCodec和lamemp3多段音頻截取拼接

    這篇文章主要為大家介紹了Android開發(fā)使用MediaCodec和lamemp3實現(xiàn)多段音頻截取拼接的編程示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-04-04
  • Android 多國語言value文件夾命名的方法

    Android 多國語言value文件夾命名的方法

    這篇文章主要介紹了Android 多國語言value文件夾命名的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-03-03
  • Android彈出DatePickerDialog并獲取值的方法

    Android彈出DatePickerDialog并獲取值的方法

    這篇文章主要為大家詳細介紹了Android彈出DatePickerDialog并獲取值的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • 詳解Android應(yīng)用中DialogFragment的基本用法

    詳解Android應(yīng)用中DialogFragment的基本用法

    Android App中建議使用DialogFragment作為對話框的容器,DialogFragment類提供了創(chuàng)建對話框并管理其外觀需要的所有控件,本文主要內(nèi)容便為詳解Android應(yīng)用中DialogFragment的基本用法,而不再需要調(diào)用Dialog的方法需要的朋友可以參考下
    2016-05-05
  • Android手勢控制實現(xiàn)縮放、移動圖片

    Android手勢控制實現(xiàn)縮放、移動圖片

    這篇文章主要為大家詳細介紹了Android手勢控制實現(xiàn)縮放、移動圖片,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-02-02
  • Android 使用 RxJava2 實現(xiàn)倒計時功能的示例代碼

    Android 使用 RxJava2 實現(xiàn)倒計時功能的示例代碼

    本篇文章主要介紹了Android 使用 RxJava2 實現(xiàn)倒計時功能的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-03-03
  • Android Splash界面白屏、黑屏問題的解決方法

    Android Splash界面白屏、黑屏問題的解決方法

    這篇文章主要為大家詳細介紹了Android Splash界面白屏、黑屏問題的解決方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • Retrofit網(wǎng)絡(luò)請求和響應(yīng)處理重點分析講解

    Retrofit網(wǎng)絡(luò)請求和響應(yīng)處理重點分析講解

    這篇文章主要介紹了Retrofit網(wǎng)絡(luò)請求和響應(yīng)處理重點分析,在使用?Retrofit發(fā)起網(wǎng)絡(luò)請求時,我們可以通過定義一個接口并使用Retrofit的注解來描述這個接口中的請求,Retrofit會自動生成一個實現(xiàn)該接口的代理對象
    2023-03-03
  • Android用戶輸入自動提示控件AutoCompleteTextView使用方法

    Android用戶輸入自動提示控件AutoCompleteTextView使用方法

    這篇文章主要為大家詳細介紹了Android用戶輸入自動提示控件AutoCompleteTextView的使用方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • Android仿微信進度彈出框的實現(xiàn)方法

    Android仿微信進度彈出框的實現(xiàn)方法

    最近公司項目需要實現(xiàn)類似微信進度條彈出框效果,其實現(xiàn)方法并不難,下面給大家介紹下Android仿微信進度彈出框的實現(xiàn)方法,需要的朋友參考下吧
    2017-01-01

最新評論