android监听app被杀死,【Android】App应用前后台切换的一种监听方法

Android本身并没有提供监听App的前后台切换操作的方法。最近看到一种简单巧妙的方法来监听前后台,这里分享记录一下。

一、Activity生命周期

我们知道在Android中,两个Activity,分别为A和B。假设此时A在前台,当A启动B时,他们俩之间的生命周期关系如下,可以参考之前的这篇文章【Android】Activity与Fragment的生命周期的关系:

A.onPause() -> B.onCreate() -> B.onStart() -> B.onResume() -> A.onStop()

也就是说B的onStart()方法是在A的onStop()方法之前执行的,我们可以根据这点来做文章。在所有Activity的onStart()和onStop()方法中进行计数,计数变量为count,在onStart中将变量加1,onStop中减1。

那么这个count在整个App的生命周期里的值就会像下面这样:

count

2| _ _ _ _

1| ____| |___| |___| |___| |____

0| ___| |___

===========================================> 时间

a b c d

横轴表示时间,纵轴表示count的值。那么a、b、c、d四个时间点发生的事情如下:

a点就是启动了应用;

b点是Activity_A启动了另一个Activity_B;

c点是Activity_B启动了另一个Activity_C,后面以此类推;

d点是应用切换到了后台;

从上面的情况看出,可以通过对count计数为0,来判断应用被从前台切到了后台。同样的,从后台切到前台也是类似的道理。具体实现看后面的代码。

具体的实现中,我们可以实现一个BaseActivity,然后让其他所有Activity都继承自它,然后在生命周期函数中做相应的检测。还有更简单的方法,Android在API 14之后,在Application类中,提供了一个应用生命周期回调的注册方法,用来对应用的生命周期进行集中管理,这个接口叫registerActivityLifecycleCallbacks(),可以通过它注册自己的ActivityLifeCycleCallback,每一个Activity的生命周期都会回调到这里的对应方法。

//源码位于Application类中

public interface ActivityLifecycleCallbacks {

void onActivityCreated(Activity activity, Bundle savedInstanceState);

void onActivityStarted(Activity activity);

void onActivityResumed(Activity activity);

void onActivityPaused(Activity activity);

void onActivityStopped(Activity activity);

void onActivitySaveInstanceState(Activity activity, Bundle outState);

void onActivityDestroyed(Activity activity);

}

其实这个注册方法的本质和我们实现BaseActivity是一样的,只是将生命周期的管理移到了Activity本身的实现中。

二、实现

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,说明是从后台到前台

if (mFinalCount == 1){

//说明从后台回到了前台

}

}

@Override

public void onActivityResumed(Activity activity) {

}

@Override

public void onActivityPaused(Activity activity) {

}

@Override

public void onActivityStopped(Activity activity) {

mFinalCount--;

//如果mFinalCount == 0,说明是前台到后台

if (mFinalCount == 0){

//说明从前台回到了后台

}

}

@Override

public void onActivitySaveInstanceState(Activity activity, Bundle outState) {

}

@Override

public void onActivityDestroyed(Activity activity) {

}

});

}

}

参考资料

判断Android程序前后台切换的几种方法

Android应用前后台切换的判断

优雅的使用ActivityLifecycleCallbacks管理Activity和区分App前后台

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值