Android 实现监听应用从后台回到前台

应用开发中,也许有这样一种场景,应用程序有一个主页面,然后在主页面点击返回键或者 HOME 键回到桌面,再打开应用回到程序主页。再次回到主页的时候,我们可能需要更新一些数据或者做一些其他操作。

那么可能会很容易想到一种方式:监听返回键或者 HOME 键,在用户点击返回键或者 HOME 键的时候,在主页设置一个 flag,等再次回来的时候根据这个 flag 的状态去判断就可以了。

但是,往往现实并不那么尽如人意。返回事件可以很简单通过 onKeyDown() 或者 onBackPressed() 去监听到;但 HOME 键的事件并没法在 onKeyDown() 去监听到,网上有一些通过广播或者其他一些麻烦的方式可以做到,但是很容易让我想到不同 ROM 会不会有其他兼容性问题呢。

所以想了另外的解决方式。

Android 的 Application 中 有这个一个接口 ActivityLifecycleCallbacks ,它可以监听到应用内所有 Activity 的生命周期方法。那么我们能不能从这个入手呢。

想一下,我们到主页面主要有这样的场景:

1.桌面 -> 主页面

生命周期如下:... --(点 HOME 或者返回)--> 主页面#onPause --(重新打开应用)--> 主页面#onResume -> ...

2.子页面 -> 主页面

生命周期如下:... -> 子页面#onPause -> ... -> 主页面#onResume ->...

那么看到这里,基本上就可以找到一种解决方式了。我们只要知道上一次主页面调用了 onPause,这一次主页面调用了 onResume,那么就可以确定我们应用是从其他地方回来,当然包含桌面或者其他 APP。主要代码如下:

public class AppRunningStatusCallbacks implements Application.ActivityLifecycleCallbacks {

private boolean mMainOnPaused = false;
private boolean mMainOnResumed = false;

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

}

@Override
public void onActivityStarted(Activity activity) {

}

@Override
public void onActivityResumed(Activity activity) {
mMainOnResumed = (activity instanceof MainActivity);
if (mMainOnPaused && mMainOnResumed) {
// 应用从桌面或者其他地方回来
// 可以做一些回调
}
}

@Override
public void onActivityPaused(Activity activity) {
mMainOnPaused = (activity instanceof MainActivity);
}

@Override
public void onActivityStopped(Activity activity) {

}

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

}

@Override
public void onActivityDestroyed(Activity activity) {

}
}

简简单单,这样就实现了。

    原文作者:Android
    原文地址: https://juejin.im/entry/58edde1c44d9040057755b2d
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞