Android使用ActivityLifecycleCallbacks管理Activity和区分App前后台
一、ActivityLifecycleCallbacks接口介绍
官方地址:https://developer.android.com/reference/android/app/Application.ActivityLifecycleCallbacks
在 Android API 14之后的Application类中,为我们提供了一个应用生命周期回调的注册方法,用来对应用的生命周期进行集中管理,这个接口叫registerActivityLifecycleCallbacks,可以通过它注册自己的ActivityLifeCycleCallback,每一个Activity的生命周期都会回调到这里的对应方法。
有了ActivityLifeCycleCallback接口,我们就可以完成之前我们想做的类似限制制定Activity个数等相关需求,因为所有Activity的生命周期都会在这里回调,我们可以根据条件随心处理。
Activity 的生命周期图为:https://developer.android.com/images/activity_lifecycle.png;
ActivityLifecycleCallbacks 的方法列表文档:https://developer.android.com/reference/android/app/Application.ActivityLifecycleCallbacks
两者几乎是一一对应的,不管是做Activity的限制还是Activity的状态统计都是非常方便的,而且里面还有一个void onActivitySaveInstanceState(Activity activity, Bundle outState) 方法,非常方便我们来保存Activity状态数据。
使用ActivityLifecycleCallbacks我们可以完成类似如下的功能:
1. 限制指定的Activity的数量
2. 控制在特定情况下只会有一个Activity被打开
3. 判断App前后台状态
二、ActivityLifecycleCallbacks的应用
Application.ActivityLifecycleCallbacks是Application中的一个接口,使用起来也很简单,只需要调用registerActivityLifecycleCallbacks方法即可完成注册。Application.ActivityLifecycleCallbacks中对应的监听的生命周期方法会在Activity中的生命方法调用父类的方法之后被触发。
import android.app.Activity;
import android.app.Application;
import android.os.Bundle;
import android.util.Log; public class LifecycleApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
init();
} private void init() {
registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
Log.e("Lifecycle",activity.getLocalClassName()+" was Created"+"activity==null "
+(activity==null)+" activity.isFinishing() "+(activity.isFinishing())+" activity.isDestroyed() "+activity.isDestroyed());
} @Override
public void onActivityStarted(Activity activity) {
Log.e("Lifecycle",activity.getLocalClassName()+" was Started"+"activity==null "
+(activity==null)+" activity.isFinishing() "+(activity.isFinishing())+" activity.isDestroyed() "+activity.isDestroyed());
} @Override
public void onActivityResumed(Activity activity) {
Log.e("Lifecycle",activity.getLocalClassName()+" was oResumed"+"activity==null "
+(activity==null)+"activity.isFinishing() "+(activity.isFinishing())+"activity.isDestroyed() "+activity.isDestroyed());
} @Override
public void onActivityPaused(Activity activity) {
Log.e("Lifecycle",activity.getLocalClassName()+" was Pauseed"+"activity==null "
+(activity==null)+"activity.isFinishing() "+(activity.isFinishing())+"activity.isDestroyed() "+activity.isDestroyed());
} @Override
public void onActivityStopped(Activity activity) {
Log.e("Lifecycle",activity.getLocalClassName()+" was Stoped"+"activity==null "
+(activity==null)+"activity.isFinishing() "+(activity.isFinishing())+"activity.isDestroyed() "+activity.isDestroyed());
} @Override
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
Log.e("Lifecycle",activity.getLocalClassName()+" was SaveInstanceState"+"activity==null "
+(activity==null)+"activity.isFinishing() "+(activity.isFinishing())+"activity.isDestroyed() "+activity.isDestroyed());
} @Override
public void onActivityDestroyed(Activity activity) {
Log.e("Lifecycle",activity.getLocalClassName()+" was Destroyed"+"activity==null"
+(activity==null)+" activity.isFinishing() "+(activity.isFinishing())+" activity.isDestroyed()"+activity.isDestroyed());
}
});
}
}
在清单中声明Application,无需在Activity添加额外的代码就可以实现监控:
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View; public class MainActivity extends AppCompatActivity { public static final String LIFECYCLE = "MainActivity:Lifecycle"; @Override
protected void onCreate(Bundle savedInstanceState) {
Log.e(LIFECYCLE, "onCreate() is Running__before super.onCreate called");
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.e(LIFECYCLE, "onCreate() is Running__after super.onCreate called");
} @Override
protected void onRestart() {
Log.e(LIFECYCLE, "onRestart() is Running__before super's called");
super.onRestart();
Log.e(LIFECYCLE, "onRestart() is Running__after super's called");
} @Override
protected void onStart() {
Log.e(LIFECYCLE, "onStart() is Running__before super.onStart called");
super.onStart();
Log.e(LIFECYCLE, "onStart() is Running__after super.onStart called");
} @Override
protected void onResume() {
Log.e(LIFECYCLE, "onResume() is Running__before super.onResume called");
super.onResume();
Log.e(LIFECYCLE, "onResume() is Running__after super.onResume called");
} @Override
protected void onPause() {
Log.e(LIFECYCLE, "onPause() is Running__before super's called");
super.onPause();
Log.e(LIFECYCLE, "onPause() is Running__after super's called");
} @Override
protected void onStop() {
Log.e(LIFECYCLE, "onStop() is Running__before super's called");
super.onStop();
Log.e(LIFECYCLE, "onStop() is Running__after super's called");
} @Override
protected void onDestroy() {
Log.e(LIFECYCLE, "onDestroy() is Running__before super's called");
super.onDestroy();
Log.e(LIFECYCLE, "onDestroy() is Running__after super's called");
} public void toTask(View view) {
startActivity(new Intent(this, TaskActivity.class));
//finish();
}
}
三、使用 ActivityLifecycleCallbacks 判断App前后台状态
App 前后台的切换一般情况下都是按Home来进行,当然也有别的方式,但是此时Activity的生命周期是一样的:
HOME键前后台切换Activity的执行顺序:onPause->onStop->onRestart->onStart->onResume
BACK键前后台切换Activity键的顺序: onPause->onStop->onDestroy->onCreate->onStart->onResume
其实按BACK按键就是退出app了,不算是前台后切换。
现在我们知道App的由前台切换到后台所有打开的Activity会走:
onPause->onStop
后台切换到前台所有打开的Activity会走:
->onRestart->onStart->onResume
前后台切换App所有打开的Activity的生命周期都是一样的,这样我就可以在ActivityLifecycleCallbacks回调接口中记录生命周期:
public class App extends Application {
//记录Activity的总个数
public int count = 0;
private static App mApp;
public static Stack<ActivityDetail> store;
//商品详情页最多个数,这里为了测试只写了2,大家根据自己的情况设值
private static final int MAX_ACTIVITY_DETAIL_NUM = 2;
@Override
public void onCreate() {
super.onCreate();
mApp = this;
store = new Stack<>();
registerActivityLifecycleCallbacks(new SwitchBackgroundCallbacks());
}
public static App getAppContext() {
return mApp;
}
public static boolean toGoodsDetail(String id){
if(store == null || store.empty()){
return false;
}
for(ActivityDetail activityDetail : store){
if(id.equalsIgnoreCase(activityDetail.getID())){ //当前商品的详情页已经打开
activityDetail.finish();
// 这是你需要在AndroidManifest.xml中添加"Android.permission.STOP_APP_SWITCHES"用户权限,前提是必须是系统应用才可以。
// ActivityManager am = (ActivityManager) getAppContext().getSystemService(Activity.ACTIVITY_SERVICE);
// am.moveTaskToFront(activityDetail.getTaskId(), 0);
return true;
}
}
return false;
}
private class SwitchBackgroundCallbacks implements ActivityLifecycleCallbacks {
@Override
public void onActivityCreated(Activity activity, Bundle bundle) {
if(activity instanceof ActivityDetail) {
if(store.size() >= MAX_ACTIVITY_DETAIL_NUM){
store.peek().finish(); //移除栈底的详情页并finish,保证商品详情页个数最大为10
}
store.add((ActivityDetail) activity);
}
}
@Override
public void onActivityStarted(Activity activity) {
if (count == 0) { //后台切换到前台
Log.v("danxx", ">>>>>>>>>>>>>>>>>>>App切到前台");
}
count++;
}
@Override
public void onActivityResumed(Activity activity) {
}
@Override
public void onActivityPaused(Activity activity) {
}
@Override
public void onActivityStopped(Activity activity) {
count--;
if (count == 0) { //前台切换到后台
Log.v("danxx", ">>>>>>>>>>>>>>>>>>>App切到后台");
}
}
@Override
public void onActivitySaveInstanceState(Activity activity, Bundle bundle) {
}
@Override
public void onActivityDestroyed(Activity activity) {
store.remove(activity);
}
}
// 获取当前的Activity
public Activity getCurActivity() {
return store.lastElement();
}
}
Android使用ActivityLifecycleCallbacks管理Activity和区分App前后台的更多相关文章
- 朝花夕拾-android 自定义application 管理activity的生命周期
为了安全退出多个已创建的activity? 可以自定义application:myapplication. 增加一个list成员保存,一些关键的已创建的activity实例: private List ...
- Android源码剖析之Framework层实战版(Ams管理Activity启动)
本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 讲到实战,就不得不拿两个例子来说明,本篇想拿的是应用最广泛的两个:Ams和Wms,一个管理activ ...
- Android 管理Activity中的fragments
为了管理Activity中的fragments,需要使用FragmentManager,为了得到它,需要调用Activity中的getFragmentManager()方法,接下来详细介绍,感兴趣的朋 ...
- 【Android工具类】Activity管理工具类AppManager
转载请注明出处:http://blog.csdn.net/zhaokaiqiang1992 import java.util.Stack; import android.app.Activity; i ...
- Android-管理Activity生命周期 -重新创建Activity
按照正常的app行为,很少情况下activity会销毁,只有当用户点击了返回按钮或者activity通过调用finish()发出销毁信号.系统也有可能销毁activity如果它是停止状态并且很久没有使 ...
- Android-管理Activity生命周期 -停止和重启Activity
停止和重启activity在activity的生命周期中很重要,它能让用户感觉你的app总是激活的而且不会丢失他们的进度.activity在下面的这些情况会停止和重启: 用户打开常用app窗口然后从你 ...
- Android-管理Activity生命周期 -暂停和恢复一个Activity
在正常的使用app时,前台的activity有时候会被可见的组件阻塞导致activity暂停.比如,当打开一个半透明的activity(就像打开了一个对话框),之前的activity就会暂停.只要ac ...
- Android-管理Activity生命周期 -开始一个Activity
很多程序都是从main()方法开始启动的,和其他程序不同,android是在activity生命周期的特定状态的特定回调方法中初始化代码的.activity启动和销毁的时候都用很多回调方法. 这里将要 ...
- Android内存优化6 了解Android是如何管理App内存
1, Dalvik & ART Android在4.4之前一直使用的Dalvik虚拟机作为App的运行VM的, 4.4中引入了ART作为开发者备选, 5.0起正式将ART作为默认VM了. 我们 ...
随机推荐
- git 使用详解(6)—— 3种撤消操作
接下来,我们会介绍一些基本的撤消操作相关的命令.请注意,有些操作并不总是可以撤消的,所以请务必谨慎小心,一旦失误,就有可能丢失部分工作成果. 修改最后一次提交 git commit --amend 有 ...
- SpringBean生命周期及作用域
bean作用域 在Bean容器启动会读取bean的xml配置文件,然后将xml中每个bean元素分别转换成BeanDefinition对象.在BeanDefinition对象中有scope 属性,就是 ...
- Appium之WebView自动化
WebView的测试:主要作用在混合(Hybrid)的应用 * 一部分是原生界面和代码,而另一部分是内嵌网页 * 比如微信.支付宝 * 内嵌了一个浏览器内核,由浏览器内核实现的 安卓应用中的内嵌的展示 ...
- solr索引基本原理
solr是一个全局检索引擎,能够快速地从大量的文本数据中选出你所需要的数据,而你只需要提供相应的关键词进行检索.solr的高效率查询靠的是底层强大的索引库,所以solr最关键的技术也是其底层的索引设计 ...
- irules
BIG-IP系统iRules基本概念_v11.6.1 2017年10月10日 00:35:16 ifelif 阅读数:1097 1 iRules介绍 什么是iRule iRule是BIG-IP本地 ...
- 据说60%的Java程序员不明白分布式一致性?这次彻底搞懂!
前言 在计算机科学领域,分布式一致性是一个相当重要且被广泛探索与论证问题,首先来看三种业务场景. 1.火车站售票 假如说我们的终端用户是一位经常坐火车的旅行家,通常他是去车站的售票处购买车票,然后拿着 ...
- 人生苦短,我用Python(2)
1.for循环遍历字符串: string="人生苦短,我用Python" print(string) for ch in string: print(ch) for 循环语句还可以 ...
- 如何将hive表中的数据导出
近期经常将现场的数据带回公司测试,所以写下该文章,梳理一下思路. 1.首先要查询相应的hive表,比如我要将c_cons这张表导出,我先查出hive中是否有这张表. 查出数据,证明该表在hive中存在 ...
- 后缀数组SA入门(史上最晦涩难懂的讲解)
参考资料:victorique的博客(有一点锅无伤大雅,记得看评论区),$wzz$ 课件(快去$ftp$%%%),$oi-wiki$以及某个人的帮助(万分感谢!) 首先还是要说一句:我不知道为什么我这 ...
- Dubbo简介与基本概念
场景 分布式系统的发展演变以及RPC简介: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/103555049 Dubbo简介 Ap ...