android实现应用程序前台和后台之间转换的监听的两种方式

转载请注明出处:http://blog.csdn.net/woshizisezise/article/details/53303832

今天给大家介绍一下android是如何监听我们的应用程序从前台界面变成后台进程以及如何判断从后台进程跳转回前台界面的方法,我会介绍两种方式,从不同的角度来验证我们所需要的效果,话不多说,开始吧!


一、通过ActivityManager.RunningAppProcessInfo判断

首先,我们需要写一个BaseActivity,然后让我们应用程序的Activity都继承自BaseActivity,这样就可以统一管理,然后在BaseActivity的onResume()和onStop()方法中进行判断应用程序是否进入到后台并且是否从后台返回到了前台,直接看代码:

public class BaseActivity extends Activity {

    public static boolean isActive; //全局变量

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_base);
    }

    @Override
    protected void onResume() {
        if (!isActive) {
            //app 从后台唤醒,进入前台
            isActive = true;
            Log.i("ACTIVITY", "程序从后台唤醒");
        }
        super.onResume();
    }

    @Override
    protected void onStart() {
        super.onStart();
    }

    @Override
    protected void onPause() {
        super.onPause();
    }

    @Override
    protected void onStop() {
        if (!isAppOnForeground()) {
            //app 进入后台
            isActive = false;//记录当前已经进入后台
            Log.i("ACTIVITY", "程序进入后台");
        }
        super.onStop();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
    }

    /**
     * APP是否处于前台唤醒状态
     *
     * @return
     */
    public boolean isAppOnForeground() {
        ActivityManager activityManager = (ActivityManager) getApplicationContext().getSystemService(Context.ACTIVITY_SERVICE);
        String packageName = getApplicationContext().getPackageName();
        List<ActivityManager.RunningAppProcessInfo> appProcesses = activityManager
                .getRunningAppProcesses();
        if (appProcesses == null)
            return false;

        for (ActivityManager.RunningAppProcessInfo appProcess : appProcesses) {
            // The name of the process that this object is associated with.
            if (appProcess.processName.equals(packageName)
                    && appProcess.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
                return true;
            }
        }

        return false;
    }
}

下面我们来看看运行效果:

10-23 12:31:31.610 23043-23043/com.cn.foregroundtest I/ACTIVITY: 程序从后台唤醒
10-23 12:31:39.432 23043-23043/com.cn.foregroundtest I/ACTIVITY: 程序进入后台

这样来回切换会发现,当我们按home键或者锁屏按钮的时候,就会执行onStop里面的方法,当我们重新返回到应用中的时候,会走onResume里面的方法,这样第一种方式就实现了。

二、通过Application中注册生命周期监听回调的方式

首先,我们新建一个类TheApplication继承自Application,并在AndroidManifest.xml中将应用的Application声明为TheApplication,然后我们在TheApplication中实现onCreate()方法,在onCreate()方法中注册这样的一个回调方法registerActivityLifecycleCallbacks,来看看代码实现:

public class TheApplication extends Application {

    private int mFinalCount;

    @Override
    public void onCreate() {
        super.onCreate();
        registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
            @Override
            public void onActivityCreated(Activity activity, Bundle savedInstanceState) {

            }

            @Override
            public void onActivityStarted(Activity activity) {
                mFinalCount++;
                //如果mFinalCount ==1,说明是从后台到前台
                Log.e("onActivityStarted", mFinalCount +"");
                if (mFinalCount == 1){
                    //说明从后台回到了前台
                }
            }

            @Override
            public void onActivityResumed(Activity activity) {

            }

            @Override
            public void onActivityPaused(Activity activity) {

            }

            @Override
            public void onActivityStopped(Activity activity) {
                mFinalCount--;
                //如果mFinalCount ==0,说明是前台到后台
                Log.i("onActivityStopped", mFinalCount +"");
                if (mFinalCount == 0){
                    //说明从前台回到了后台
                }
            }

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

            }

            @Override
            public void onActivityDestroyed(Activity activity) {

            }
        });
    }
}

程序运行起来看看日志输出:

10-23 12:38:22.925 5815-5815/com.cn.foregroundtest E/onActivityStarted: 1
10-23 12:38:27.554 5815-5815/com.cn.foregroundtest I/onActivityStopped: 0
10-23 12:38:29.817 5815-5815/com.cn.foregroundtest E/onActivityStarted: 1
10-23 12:38:31.368 5815-5815/com.cn.foregroundtest I/onActivityStopped: 0

可以看到当我来回切换应用返回到桌面和从桌面点击图标重新打开应用时,日志的输出情况和我之前提到的是一样的,当onActivityStarted里我们的变量值为1时,说明应用从后台返回到了前台界面,当onActivityStopped里我们的变量值为0时,说明我们的应用从前台界面返回到了后台,这里需要特别注意的一点是当我们锁屏时,这里也会认为应用返回到了后台进程。


好了,今天要给大家讲的如何判断android应用程序在前台和后台之间的转换的状态判断就到这里,希望对大家有帮助。

如果你觉得我的文章对你有帮助,并且希望帮助更多人,欢迎分享并关注我的微信公众号“Android开发的奥秘”,或扫描识别下方的二维码,我会不定期的分享给大家更多有用的资讯,谢谢!
这里写图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胖子爱你520

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值