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程序设计有所帮助。

您可能感兴趣的文章:

  • Android 删除指定包名的App实例代码
  • Android获取应用程序名称(ApplicationName)示例
  • Android ApplicationInfo 应用程序信息的详解
  • android 获取本机其他app的版本信息的示例代码
  • Android获取手机型号/系统版本号/App版本号等信息实例讲解
  • android app icon 图标大小尺寸
  • Android如何动态改变App桌面图标
  • Android App更改应用的图标的实现方法
  • Android编程获取APP应用程序基本信息辅助类【APP名称、包名、图标,版本号等】
(0)

相关推荐

  • Android获取应用程序名称(ApplicationName)示例

    MainActivity如下: 复制代码 代码如下: package cn.testapplicationname; import android.os.Bundle; import android.widget.TextView; import android.app.Activity; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; /** * Demo描述: * 获取应

  • Android如何动态改变App桌面图标

    时不时的我们就会发现,一些我们常见的应用,比如某宝,某东,在一些特殊的日子中,比如双十一,元旦,为了迎合这样一个日子的气氛,在桌面的应用图标就会发生改变,其实对于这样的一个桌面图标更换,Android中为我们提供了AndroidManifest.xml里的<activity-alias>标签实现方式(更多文章请关注我的微信公众账号,左边二维码). 我们知道,我们每写一个 Activity就要在AndroidManifest进行配置一下,我们才可以正常的启动它,除此之外,我们还可以对它设置一个别

  • Android获取手机型号/系统版本号/App版本号等信息实例讲解

    MainActivity如下: 复制代码 代码如下: package cn.testgethandsetinfo; import android.os.Bundle; import android.text.TextUtils; import android.widget.TextView; import android.app.Activity; import android.content.Context; import android.content.pm.PackageInfo; imp

  • android app icon 图标大小尺寸

    在android程序中,在drawable中设置好图标后,但结果在小米2可没有显示出来,但在我自己的htc中和模拟器中显示正常.后来发现小米的dpi不一样. 后来发现,android为了适应不同的分辨率和dpi,加载了一系列的图标. LDPI (Low Density Screen,120 DPI),其图标大小为 36 x 36 px. MDPI (Medium Density Screen, 160 DPI),其图标大小为 48 x 48 px. HDPI (High Density Scre

  • Android App更改应用的图标的实现方法

    Android App更改应用的图标的实现方法 一般情况下,我们App图标在Androidmanifest.xml中设置,通过Application android:icon属性指定,写法如下: <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package=&q

  • android 获取本机其他app的版本信息的示例代码

    我们公司过一个测速的插件,我需要去被另一个app升级,这里就会有一个问题,就是如何去获取本机其他app的版本信息呢,后面我会写一篇app自动升级的文章. 我们先建一个实体类,用来存放app信息. package com.zznode.bean; import android.graphics.drawable.Drawable; import android.util.Log; /** * Created by 杰梵 on 2017/9/25. * 用来存取app的信息. */ public c

  • Android ApplicationInfo 应用程序信息的详解

    Android ApplicationInfo 应用程序信息 1.简述 1 ApplicationInfo是android.content.pm包下的一个实体类,用于封装应用的信息,flags是其中的一个成员变量public int flags = 0;用于保存应用的标志信息. 2 ApplicationInfo 通过它可以得到一个应用基本信息. 这些信息是从AndroidManifest.xml的< application >标签获取的 3 ApplicationInfo对象里保存的信息都是

  • Android编程获取APP应用程序基本信息辅助类【APP名称、包名、图标,版本号等】

    本文实例讲述了Android编程获取APP应用程序基本信息辅助类.分享给大家供大家参考,具体如下: 经常会用到 获取App信息,可以用这个工具类,可以获得 APP的应用程序名称.包名.图标,版本号基本信息 //跟App相关的辅助类 public class AppUtils { /** * 获取应用程序名称 */ public static synchronized String getAppName(Context context) { try { PackageManager package

  • Android 删除指定包名的App实例代码

    废话不多说了,直接给大家贴代码了,具体代码如下所示: /** * check and delete the old package app if it exists. */ private void checkOldPackage() { String packageName = "xxx.xxx.xxx.xxx"; if (isAvilible(this, packageName)) { Intent uninstall_intent = new Intent(); uninstal

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

    本文实例讲述了Android开发实现根据包名判断App运行状态的方法.分享给大家供大家参考,具体如下: 前面讲过Android开发判断一个app应用是否在运行的方法,这里实现获取指定包名的 APP 是否还在后台运行,判断 APP 是否存活. 背景 可以根据 App 是否有 Service 分两类情况处理: ① 没有 Service ② 有 Service 对于没有 Service 的 App,程序一旦切换到后台,可能很快就被回收了,这里使用 ActivityManager.getRunningT

  • Android获取、更改包名的小技巧分享(超实用)

    前言 小菜因为工作需要,经常需要一套代码修改很多次包名,虽然不是什么技术活,但是小菜的用的次数多了就有了一点点小技巧分享给大家,下面话不多说了,来一起看看详细的介绍吧. 方法如下: 1. 如果源码是在本机电脑中,首先找到源码多位置,例如:由包名 com.aaa.bbb 修改为包名 com.ccc.ddd,可以直接重命名,本地修改: 2. AndroidStudio 打开本项目: 3. 删除 .gradle: 4. 把 build.gradle 中 appicationId 替换为新的包名: 5.

  • Android Studio 修改应用包名实例详解

    Android Studio 修改应用包名实例详解 我们平时新建项目有些朋友可能当时就是随意写的一个包名,然后在项目过程中, 又感觉这个包名不太好,所以就要对包名进行修改,根据我们正常的修改方式,是这样的. 在种情况是只能修改最外层的那个名称, 如果我们现在是需要修改中间的某一个,这里就行不通了. 那么我们来看一下如何修改成你最终要的包名. 操作图如下: 看到没有,我们只需要在setting里面,把 compact empty middle packages 这个选项去掉,这样,我们的包的层次结

  • Android开发获取系统中已安装程序信息的方法

    本文实例讲述了Android开发获取系统中已安装程序信息的方法.分享给大家供大家参考,具体如下: public class AppInfoParser { private static String tag = "AppInfoParser"; public static List<AppInfo> getAppInfos(Context context){ //首先获取到包的管理者 PackageManager packageManager = context.getPa

  • Android开发之微信底部菜单栏实现的几种方法汇总

     实现方式 实现的方式有很多种 这里总结最常见的几种方式,以后再添加其他的. viewPager + RadioGroup viewPager + FragmentTabHost viewpager +TabLayout viewPager+RadioGroup 感觉这是最简单的一个了,我也就不贴代码 说说我理解的思路吧 通过给pager 和RadioGroup 添加监听,监听两个控件的变化 实现联动 当viewPager的显示pager改变就会触发监听 ,在监听中选中对应的RadioButto

  • Android开发中Activity创建跳转及传值的方法

    在Android系统的江湖中有四大组件:活动(Activity), 服务(Service), 广播接收器(Broadcast Reciver)和内容提供者(Content Provider). 今天所介绍的就是Android开发中的四大组件之一:Activity,其他那三大组件以后再进行介绍.说道Android中的Activity,如果你做过iOS开发的话,Activity类似于iOS中的ViewController(视图控制器).在应用中能看到的东西都是放在活动中的.活动是安卓开发比较重要的东

  • Android开发中使用WebView控件浏览网页的方法详解

    本文实例讲述了Android开发中使用WebView控件浏览网页的方法.分享给大家供大家参考,具体如下: 项目中遇到数学展示问题,常规的Textview显示处理不了数学公式,利用图片生成对服务器又产生较大压力,经过查询,可以通过webview加载JS实现.IOS同样的方法也可实现,但JS渲染效率远高于安卓.对Webview做下总结. 1.WebView 在使用WebView控件时,首先需要在xml布局文件中定义一个WebView控件,定义的方法如下: <WebView android:id=&quo

  • Android开发实现读取assets目录下db文件的方法示例

    本文实例讲述了Android开发实现读取assets目录下db文件的方法.分享给大家供大家参考,具体如下: 最近准备打算写一个关于天气预报的app,偶然的机会在一大神的博客上看到了一个获取天气的api,获取天气是通过城市的cityID,项目中准备通过读取weather_city.db数据库来查询cityID,这篇文章写怎么读取assets目录下的db文件,其实方法也挺简单的就是把assets目录下的db文件复制一份到"/data/data/" + packName + "/&

  • Android开发基础之创建启动界面Splash Screen的方法

    本文实例讲述了Android开发基础之创建启动界面Splash Screen的方法.分享给大家供大家参考.具体如下: 启动界面Splash Screen在应用程序是很常用的,往往在启动界面中显示产品Logo.公司Logo或者开发者信息,如果应用程序启动时间比较长,那么启动界面就是一个很好的东西,可以让用户耐心等待这段枯燥的时间. Android 应用程序创建一个启动界面Splash Screen非常简单.比如创建一个工程MySample,主Acitity就叫MySample,创建另一个Activ

随机推荐