文档章节

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

dailei1021
 dailei1021
发布于 2016/03/03 17:04
字数 475
阅读 216
收藏 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;
    }
}


© 著作权归作者所有

共有 人打赏支持
dailei1021
粉丝 3
博文 64
码字总数 23660
作品 0
深圳
程序员
Android Activity生命周期介绍及启动时间抓取

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

孟飞阳
2016/06/16
228
0
应用保活终极总结(二):Android6.0及以上的保活实践(进程防杀篇)

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

JackJiang2011
2017/10/20
0
0
android之Files,Saving State,Preferences(一)

保存简单的APP数据 1.Shared Preferences 是一个简单,轻量级的,以键值对的机制(name/value pair---NVP)存储一些基础数据(Boolean,string,float等),最常用在保存用户的APP参数。 2.保存...

Chanimalx
2013/01/27
0
0
如何让你的app在后台被干掉后优雅的启动。

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

她的梦z
04/11
0
0
Android系统性能演变历程

Android系统是一个开源的、可自由定制的移动系统,但是绝对自由也意味着更加混乱。Android第三方定制造成Google无法对其进行控制,加上第三方应用无节制的耗费系统资源,直接后果就是Android...

徐玉强
2016/04/17
44
0

没有更多内容

加载失败,请刷新页面

加载更多

如何通过 J2Cache 实现分布式 session 存储

做 Java Web 开发的人多数都会需要使用到 session (会话),我们使用 session 来保存一些需要在两个不同的请求之间共享数据。一般 Java 的 Web 容器像 Tomcat、Resin、Jetty 等等,它们会在...

红薯
今天
3
0
C++ std::thread

C++11提供了std::thread类来表示一个多线程对象。 1,首先介绍一下std::this_thread命名空间: (1)std::this_thread::get_id():返回当前线程id (2)std::this_thread::yield():用户接口...

yepanl
今天
3
0
Nignx缓存文件与动态文件自动均衡的配置

下面这段nginx的配置脚本的作用是,自动判断是否存在缓存文件,如果有优先输出缓存文件,不经过php,如果没有,则回到php去处理,同时生成缓存文件。 PHP框架是ThinkPHP,最后一个rewrite有关...

swingcoder
今天
2
0
20180920 usermod命令与用户密码管理

命令 usermod usermod 命令的选项和 useradd 差不多。 一个用户可以属于多个组,但是gid只有一个;除了gid,其他的组(groups)叫做扩展组。 usermod -u 1010 username # 更改用户idusermod ...

野雪球
今天
3
0
Java网络编程基础

1. 简单了解网络通信协议TCP/IP网络模型相关名词 应用层(HTTP,FTP,DNS等) 传输层(TCP,UDP) 网络层(IP,ICMP等) 链路层(驱动程序,接口等) 链路层:用于定义物理传输通道,通常是对...

江左煤郎
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部