如何判断应用是在前台还是在后台运行

本文介绍三种判断Android应用程序是否处于前台的方法:使用RunningTaskInfo类(需额外权限)、使用RunningAppProcessInfo类(无需额外权限)及通过实现Application.ActivityLifecycleCallbacks接口监控所有Activity状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、通过RunningTaskInfo类判断(需要额外权限)

/** 
     *判断当前应用程序处于前台还是后台 
     */  
    public static boolean isAppRunningForeground(final Context context) {  
        ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);  
        List<RunningTaskInfo> tasks = am.getRunningTasks(1);  
        if (!tasks.isEmpty()) {  
            ComponentName topActivity = tasks.get(0).topActivity;  
            if (!topActivity.getPackageName().equals(context.getPackageName())) {  
                return true;  
            }  
        }  
        return false;  
    } 

需要在AndroidMenitfest.xml文件中添加以下权限
复制代码代码如下:

2.通过RunningAppProcessInfo类判断(不需要额外权限)

public boolean isAppRunningForeground(){
        ActivityManager activityManager = (ActivityManager) this.getSystemService(Context.ACTIVITY_SERVICE);
        List<ActivityManager.RunningAppProcessInfo> runningAppProcesses = activityManager.getRunningAppProcesses();
        for (ActivityManager.RunningAppProcessInfo appProcessInfo : runningAppProcesses) {
            if(appProcessInfo.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND){
                if(appProcessInfo.processName.equals(this.getApplicationInfo().processName))
                    return true;
            }
        }
        return false;
    }

3.继承 Application.ActivityLifecycleCallbacks 写一个自己的 ActivityLifecycleCallbacks

public class MyLifecycleHandler implements Application.ActivityLifecycleCallbacks {
    private static int resumed;
    private static int paused;
    private static int started;
    private static int stopped;

    @Override
    public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
    }

    @Override
    public void onActivityStarted(Activity activity) {
        ++started;
    }

    @Override
    public void onActivityResumed(Activity activity) {
        ++resumed;
    }

    @Override
    public void onActivityPaused(Activity activity) {
        ++paused;
        android.util.Log.w("test", "application is in foreground: " + (resumed > paused));
    }

    @Override
    public void onActivityStopped(Activity activity) {
        ++stopped;
        android.util.Log.w("test", "application is visible: " + (started > stopped));
    }

    @Override
    public void onActivityDestroyed(Activity activity) {
    }

    @Override
    public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
    }

    public static boolean isApplicationVisible() {
        return started > stopped;
    }

    public static boolean isApplicationInForeground() {
    // 当所有 Activity 的状态中处于 resumed 的大于 paused 状态的,即可认为有Activity处于前台状态中 
        return resumed > paused;
    }
}

然后在自己定义的 Application 中的 onCreate() 方法中注册该 ActivityLifecycleCallbacks:

registerActivityLifecycleCallbacks(new MyLifecycleHandler());

这样的话我们就可以在自己定义的ActivityLifecycleCallbacks中监控自己应用中的所有的Activity的状态,通过MyLifecycleHandler.isApplicationInForeground() 方法即可判断应用是否处于前台状态。另外需要注意,ActivityLifecycleCallbacks是在API14即Android 4.0加入的。

参考链接:
https://blog.youkuaiyun.com/zhufuing/article/details/53007705
https://www.cnblogs.com/chenliyang/p/6558836.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值