Android 应用前后台切换监听,2024大厂Android面试必问题目

127 阅读3分钟

目前有三种方案可以实现:

  • 监听Home键事件

  • 获取最上层Activity判断

  • 注册Activity生命周期监听回调

虽然前两中方案可以实现需求,但是有着明显的缺点和问题。监听Home键无法保证每个机型都能正常监听,不同ROM会有兼容性问题;获取最上层Activity在6.0之后需要开启权限,而且还需要后台不短轮训判断,耗费性能。

好在Android 4.0以后提供了ActivityLifecycleCallbacks类,它可以监听到应用内所有Activity 的生命周期方法,通过观察主界面退到后台以及主界面跳转应用其他界面的区别,就可以分析出监听应用前后台切换的方案。在这个场景中ActivityLifecycleCallbacks方法回调日志如下:

1.主页面 -> 桌面 -> 主页面

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

2.子页面 -> 主页面

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

所以,只要知道上一次是主页面调用了onPause,这一次是主页面调用了onResume,那么就可以确定应用是从桌面或者其他APP返回。主要代码如下:

public class AppStatusCallbacks implements Application.ActivityLifecycleCallbacks {

private boolean mMainOnStoped = 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) {

}

@Override

public void onActivityStopped(Activity activity) {

mMainOnStoped= (activity instanceof MainActivity);

}

@Override

public void onActivitySaveInstanceState(Activity activity, Bundle outState) {

}

@Override

public void onActivityDestroyed(Activity activity) {

}

}

另外,应用一般会存储Activity的任务栈,可以通过判断当前任务栈数量,来进一步优化判断方案。当停留在主界面的时候,说明Activity的任务栈的数量是1。把这个逻辑加入到上面的判断中,这样代码的容错性会更强一些。完整代码如下:

总结

现在新技术层出不穷,如果每次出新的技术,我们都深入的研究的话,很容易分散精力。新的技术可能很久之后我们才会在工作中用得上,当学的新技术无法学以致用,很容易被我们遗忘,到最后真的需要使用的时候,又要从头来过(虽然上手会更快)。

我觉得身为技术人,针对新技术应该是持拥抱态度的,入了这一行你就应该知道这是一个活到老学到老的行业,所以面对新技术,不要抵触,拥抱变化就好了。

Flutter 明显是一种全新的技术,而对于这个新技术在发布之初,花一个月的时间学习它,成本确实过高。但是周末花一天时间体验一下它的开发流程,了解一下它的优缺点、能干什么或者不能干什么。这个时间,并不是我们不能接受的。

如果有时间,其实通读一遍 Flutter 的文档,是最全面的一次对 Flutter 的了解过程。但是如果我们只有 8 小时的时间,我希望能关注一些最值得关注的点。

Android学习PDF+架构视频+面试文档+源码笔记

(跨平台开发(Flutter)、java基础与原理,自定义view、NDK、架构设计、性能优化、完整商业项目开发等)