文档章节

获取APP后台运行状态,杀死指定APP

dailei1021
 dailei1021
发布于 2016/03/03 17:04
字数 475
阅读 225
收藏 5

当我们需要控制某个APP的时候,就需要知道这个APP当前的状态;

首先要开允许检测,关闭进程的权限,在manifests中配置:

<!--杀死第三方应用的权限-->
<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" />

<!--获取TASKS权限-->
<uses-permission android:name="android.permission.GET_TASKS" />

有两种方式:

1、遍历栈里面的应用,对比是否有相同的APP应用

/**
 * APP是否正在运行
 *
 * @param context     应用上下文
 * @param packageName APP的包名
 * @return
 */
public static boolean isAppRunning(Context context, String packageName)
{
    boolean isAppRunning = false;
    ActivityManager activityManager =
            (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
    List<ActivityManager.RunningTaskInfo> list = activityManager.getRunningTasks(100);

    for (ActivityManager.RunningTaskInfo info : list)
    {
        if (info.topActivity.getPackageName().equals(packageName) ||
                info.baseActivity.getPackageName().equals(packageName))
        {
            isAppRunning = true;
            SkyLogger.d(TAG,
                    info.topActivity.getPackageName() + " info.baseActivity.getPackageName()=" +
                            info.baseActivity.getPackageName());
            break;
        }
    }
    return isAppRunning;
}

2、检测是否正在运行

/**
 * APP是否正在运行
 *
 * @param context     应用上下文
 * @param packageName APP的包名
 * @return
 */
public static boolean isAppOnForeground(Context context, String packageName)
{
    ActivityManager activityManager =
            (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
    List<RunningAppProcessInfo> appProcessInfos = activityManager.getRunningAppProcesses();

    if (appProcessInfos == null)
        {
        SkyLogger.d(TAG, "appProcessInfos == null");
        return false;
    }

    for (RunningAppProcessInfo appProcess : appProcessInfos)
    {
        if (appProcess.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND &&
                appProcess.processName.equals(packageName))
        {
            SkyLogger.d(TAG, "正在后台运行");
            return true;
        }
    }

    ComponentName cn = activityManager.getRunningTasks(1).get(0).topActivity;
    String currentPackageName = cn.getPackageName();

    if (!TextUtils.isEmpty(currentPackageName) && packageName.equals(currentPackageName))
    {
        SkyLogger.d(TAG, "正在前台运行");
        return true;
    }
    SkyLogger.d(TAG, "没有运行");
    return false;
}

杀死某个应用

/**
 * 强制关闭应用
 *
 * @param context     应用上下文
 * @param packageName 关闭的APP的包名
 */
public static void closeDeviceApp(Context context, String packageName)
{
    if (packageName != null && context != null)
    {
        ActivityManager activityManager =
                (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
        activityManager.killBackgroundProcesses(packageName);
        SkyLogger.d(TAG, packageName + " is killed.");
    }
    else
    {
        SkyLogger.d(TAG, "packageName is null.");
    }
}

如果仅仅只是检测该APP是否运行,可参照如下方法:

/**
 * APP是否正在运行
 *
 * @param context     应用上下文
 * @param packageName APP的包名
 * @return
 */
public static boolean isAppOnForeground(Context context, String packageName)
{
    ActivityManager activityManager =
            (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
    List<RunningAppProcessInfo> appProcessInfos = activityManager.getRunningAppProcesses();

    //一般不会跑到这里来,如果跑到这里来的话,要么就是这个app废了,要不就是见鬼了。。
    if (appProcessInfos == null)
    {
        SkyLogger.d(TAG, "appProcessInfos == null");
        return false;
    }
    else
    {
        for (RunningAppProcessInfo appProcess : appProcessInfos)
        {
            if (appProcess.processName.equals(packageName))
            {
                SkyLogger.d(TAG, packageName+"正在后台运行...");
                return true;
            }
        }
        return false;
    }
}


© 著作权归作者所有

共有 人打赏支持
上一篇: mybatis
下一篇: Android内存优化
dailei1021
粉丝 3
博文 64
码字总数 23660
作品 0
深圳
程序员
私信 提问
APP启动原理,APPdelegate程序状态解析

根据以上两张图片来看,app的启动过程如下: 1、打开app,调用main函数 2、main调用UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])) 第三个参数nil:代表UIApp...

业界小白
昨天
0
0
应用保活终极总结(二):Android6.0及以上的保活实践(进程防杀篇)

原作者:“裂缝中的阳光dg”,本文现已重新修订并整理发布,感谢原作者的无私分享。 1、前言 在Android 4.4及以后的系统中,应用能否常驻内存,一直以来都是相当头疼的事情,尤其移动端IM、消...

JackJiang2011
2017/10/20
0
0
Android Activity生命周期介绍及启动时间抓取

一、Activity启动流程简介: 1.启动Activity:系统会先调用onCreate方法,然后调用onStart方法,最后调用onResume,Activity进入运行状态。 2.当前Activity被其他Activity覆盖或被锁屏:系统...

孟飞阳
2016/06/16
228
0
如何让你的app在后台被干掉后优雅的启动。

作为一名Android开发师,肯定在处理用户的体验上下一定的功夫。有这么一个场景,在用户用着你开发的app的时候,突然某个聊天工具来消息了,切换到聊天工具后长时间停留,并且可能做了一些你不...

她的梦z
04/11
0
0
iOS应用程序生命周期(前后台切换,应用的各种状态)详解

iOS的应用程序的生命周期,还有程序是运行在前台还是后台,应用程序各个状态的变换,这些对于开发者来说都是很重要的。 iOS系统的资源是有限的,应用程序在前台和在后台的状态是不一样的。在...

mahb520
2014/10/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Git —— 创建版本库和提交回退版本

二、 创建版本库 版本库又叫做仓库,简单理解就是一个目录,这个目录里面所有的文件都可以被Git管理起来,每个文件的修改、删除,Git都可以跟踪,便于追踪历史与还原。找到一个合适的位置,创...

lwenhao
32分钟前
3
0
guava cache使用介绍

今天在项目中发现大量使用guava cache提供缓存,觉得不错。 jvm堆大小为5G /** * * 占用JVM内存,内部数据结构类似于ConcurrentHashMap。因为JVM堆大小的限制,guava cac...

jack_peng
37分钟前
3
0
崛起于Springboot2.X之投票活动排行榜项目(39)

简介:投票活动,用户只能一天投票一次,然后对参与投票的项目进行实时的排行功能。 架构:redis+mysql+springboot2.0.3+mybatis 不懂可以私信我哦 1、数据库建表 CREATE TABLE `t_dtb_prod...

木九天
45分钟前
2
0
logback源码分析-2、appender解析

源码基于logback 1.1.2 logback.xml文件内容如下 <?xml version="1.0"?><configuration scan="true" scanPeriod="30 seconds"> <property name="fileDir" value="/export/log/ingore......

924411018
51分钟前
2
0
【HAVENT原创】NodeJS 两个模块进行 RSA 加密解密(匹配Java RSA)

业务逻辑需要使用 NodeJS 进行公钥加密传输给 Java 后端进行私钥解密,但是默认 NodeJS 使用的 RSA padding 模式与 Java 的不一致,所以需要配置。 不啰嗦,上代码,分别用 crypto 和 node-r...

HAVENT
58分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部