Android开发实现根据包名判断App运行状态的方法

 更新时间:2017年11月16日 11:30:54   作者:cafeting  
这篇文章主要介绍了Android开发实现根据包名判断App运行状态的方法,结合实例形式分析了Android结合包名判断app运行状态的方法,需要的朋友可以参考下

本文实例讲述了Android开发实现根据包名判断App运行状态的方法。分享给大家供大家参考,具体如下:

前面讲过Android开发判断一个app应用是否在运行的方法,这里实现获取指定包名的 APP 是否还在后台运行,判断 APP 是否存活。

背景

可以根据 App 是否有 Service 分两类情况处理:

① 没有 Service

② 有 Service

对于没有 Service 的 App,程序一旦切换到后台,可能很快就被回收了,这里使用 ActivityManager.getRunningTasks(int maxNum) 方法来获取当前正在运行的任务,注意:此方法并不被系统推荐,且是一个 Deprecated 的方法。

对于有 Service 的 App,大多会有多个 Service ,且有可能都是 :remote 类型的,这样在判断上需要进行一定的处理,这里根据 App 的 uid 来判断,避免在一些特殊的情况下判断存活不准确的问题。我们使用 ActivityManager.getRunningServices(int maxNum) 方法获取当前运行中的 Service 列表。

注意:App 的 uid 对于系统内置 App 而言不是唯一的,Android 内置的应用会有共用 uid 的情况。如果你是开发系统内置应用或者类似的东西,务必要自行进行特殊方式检查。

实现

下面是几个工具类,在正式使用的时候需要配合使用,才能覆盖全部情况:

/**
* 方法描述:判断某一应用是否正在运行
* Created by cafeting on 2017/2/4.
* @param context   上下文
* @param packageName 应用的包名
* @return true 表示正在运行,false 表示没有运行
*/
public static boolean isAppRunning(Context context, String packageName) {
    ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
    List<ActivityManager.RunningTaskInfo> list = am.getRunningTasks(100);
    if (list.size() <= 0) {
      return false;
    }
    for (ActivityManager.RunningTaskInfo info : list) {
      if (info.baseActivity.getPackageName().equals(packageName)) {
        return true;
      }
    }
    return false;
}
//获取已安装应用的 uid,-1 表示未安装此应用或程序异常
public static int getPackageUid(Context context, String packageName) {
    try {
      ApplicationInfo applicationInfo = context.getPackageManager().getApplicationInfo(packageName, 0);
      if (applicationInfo != null) {
        Logger.d(applicationInfo.uid);
        return applicationInfo.uid;
      }
    } catch (Exception e) {
      return -1;
    }
    return -1;
}
/**
* 判断某一 uid 的程序是否有正在运行的进程,即是否存活
* Created by cafeting on 2017/2/4.
*
* @param context   上下文
* @param uid 已安装应用的 uid
* @return true 表示正在运行,false 表示没有运行
*/
public static boolean isProcessRunning(Context context, int uid) {
    ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
    List<ActivityManager.RunningServiceInfo> runningServiceInfos = am.getRunningServices(200);
    if (runningServiceInfos.size() > 0) {
      for (ActivityManager.RunningServiceInfo appProcess : runningServiceInfos){
        if (uid == appProcess.uid) {
          return true;
        }
      }
    }
    return false;
}

在正式使用的时候结合两者即可:

String pName = "xxx";
int uid = getPackageUid(context, pName);
if(uid > 0){
  boolean rstA = isAppRunning(context, pName);
  boolean rstB = isProcessRunning(context, uid);
  if(rstA||rstB){
    //指定包名的程序正在运行中
  }else{
    //指定包名的程序未在运行中
  }
}else{
  //应用未安装
}

总结

在探索验证程序存活的过程中,发现 ActivityManager.RunningServiceInfo 包含很多信息,一开始我是使用其 process started 属性来判断,其中 process 对应包名,但是对于只有 :remote 类型 service 时,则判定不了。

更多关于Android相关内容感兴趣的读者可查看本站专题:《Android开发入门与进阶教程》、《Android调试技巧与常见问题解决方法汇总》、《Android基本组件用法总结》、《Android视图View技巧总结》、《Android布局layout技巧总结》及《Android控件用法总结

希望本文所述对大家Android程序设计有所帮助。

相关文章

  • Flutter将整个App变为灰色的简单实现方法

    Flutter将整个App变为灰色的简单实现方法

    Flutter 是 Google 开源的 UI 工具包,帮助开发者通过一套代码库高效构建多平台精美应用,这篇文章主要给大家介绍了关于Flutter将整个App变为灰色的实现方法,在Flutter中实现整个App变为灰色是非常简单的,需要的朋友可以参考下
    2021-12-12
  • Android Handler工作原理解析

    Android Handler工作原理解析

    这篇文章主要为大家详细介绍了Android Handler的原理,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-02-02
  • Android多套环境的维护思路详解

    Android多套环境的维护思路详解

    这篇文章主要为大家介绍了Android多套环境的维护思路详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • Android读取串口数据的操作指南

    Android读取串口数据的操作指南

    在Android系统上读取串口数据是一个常见的需求,特别是当我们需要与硬件设备进行通信时,本文给大家介绍了Android读取串口数据的操作指南,文中有详细的步骤和代码示例,帮助你更好地理解和实现串口通信,需要的朋友可以参考下
    2024-05-05
  • Android编程之蓝牙测试实例

    Android编程之蓝牙测试实例

    这篇文章主要介绍了Android编程之蓝牙测试,较为详细的分析了Android蓝牙测试的相关运行环境与调试技巧,非常具有实用价值,需要的朋友可以参考下
    2015-04-04
  • Android实现日历控件示例代码

    Android实现日历控件示例代码

    本篇文章主要介绍了Android实现日历控件示例代码,实例讲解了Android日期与时间相关控件的相关使用技巧,具有一定参考价值,需要的朋友可以参考下
    2017-03-03
  • Android中AutoCompleteTextView与TextWatcher结合小实例

    Android中AutoCompleteTextView与TextWatcher结合小实例

    这篇文章主要为大家详细介绍了Android中AutoCompleteTextView与TextWatcher结合的小实例,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-05-05
  • Android烧录指令fastboot简介

    Android烧录指令fastboot简介

    fastboot 是作为 Android 系统编译器的客户端,编译后位于 ./out/host/ Linux -x86/bin/fastboot 目录下,这篇文章主要介绍了Android烧录指令fastboot简介,需要的朋友可以参考下
    2024-01-01
  • Android14原生PackageInstaller安装某些apk报错问题

    Android14原生PackageInstaller安装某些apk报错问题

    本文主要介绍了在Android 14上安装大型应用时遇到的java.lang.RuntimeException: Could not copy bitmap to parcel blob错误,下面就一起来介绍一下解决方法,感兴趣的可以了解一下
    2025-03-03
  • Listview加载的性能优化是如何实现的

    Listview加载的性能优化是如何实现的

    在android开发中Listview是一个很重要的组件,它以列表的形式根据数据的长自适应展示具体内容,用户可以自由的定义listview每一列的布局,接下来通过本文给大家介绍Listview加载的性能优化是如何实现的,对listview性能优化相关知识感兴趣的朋友一起学习吧
    2016-01-01

最新评论