Android进阶——借助简单便捷的ActivityLifecycleCallbacks实现全周期监听Activity
来源:互联网 发布:javascript模式 在线 编辑:程序博客网 时间:2024/06/05 09:58
引言
在开发中由于业务的需求,我们需要在Activity对应的生命周期方法中去完成对应的工作,比如说需要在Activity的onResume中注册某个SDK或者广播接收器、抑或是尝试打开Camera、判断app 是否在后台运行除了令人蛋疼的判断当前runningProcess 或者runningTasks 方法等,然后在Activity的onPause()中及时注销或释放掉,以前也许会在每个Activity对应的方法中增加对应的代码即可,但是从一定意义上说这代码是冗余的且不优雅,从Android4.0之后添加了Application.ActivityLifecycleCallbacks接口,我们开发者就有了一种更优雅的方案。
一、Application.ActivityLifecycleCallbacksgais概述
记得我第一次知道这个接口之后,第一时间跑到官网中查询文档,结果发现Google 又偷懒了,Summary部分竟然一句话都没有关于它的描述,差点怀疑是否进错了网站,ORZ,才发现其实是这个接口太简单了背后的原理也十分简单,本来我还以为会是观察者模式,后面发现就是一个普通回调。但是借助它我可以优雅地监控Activity的生命周期——一经注册,就会自动监听整个APP 中所有Activity 的生命周期方法的执行(会在对应的父类Activity的方法被执行之后自动触发)。
二、Application.ActivityLifecycleCallbacks源码急背后的原理简要描述
Application.ActivityLifecycleCallbacks是Application中的一个接口,使用起来也很简单,只需要调用registerActivityLifecycleCallbacks方法即可完成注册(通常是在Application中完成的)。
public class Application extends ContextWrapper implements ComponentCallbacks2 { private ArrayList<ComponentCallbacks> mComponentCallbacks = new ArrayList<ComponentCallbacks>(); private ArrayList<ActivityLifecycleCallbacks> mActivityLifecycleCallbacks = new ArrayList<ActivityLifecycleCallbacks>(); private ArrayList<OnProvideAssistDataListener> mAssistCallbacks = null; /** @hide */ public LoadedApk mLoadedApk; 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); } public Application() { super(null); } @CallSuper public void onCreate() { } /** * This method is for use in emulated process environments. It will * never be called on a production Android device, where processes are * removed by simply killing them; no user code (including this callback) * is executed when doing so. */ @CallSuper public void onTerminate() { } @CallSuper public void onConfigurationChanged(Configuration newConfig) { Object[] callbacks = collectComponentCallbacks(); if (callbacks != null) { for (int i=0; i<callbacks.length; i++) { ((ComponentCallbacks)callbacks[i]).onConfigurationChanged(newConfig); } } } @CallSuper public void onLowMemory() { Object[] callbacks = collectComponentCallbacks(); if (callbacks != null) { for (int i=0; i<callbacks.length; i++) { ((ComponentCallbacks)callbacks[i]).onLowMemory(); } } } @CallSuper public void onTrimMemory(int level) { Object[] callbacks = collectComponentCallbacks(); if (callbacks != null) { for (int i=0; i<callbacks.length; i++) { Object c = callbacks[i]; if (c instanceof ComponentCallbacks2) { ((ComponentCallbacks2)c).onTrimMemory(level); } } } } /* **注册ActivityLifecycleCallbacks回调 */ public void registerActivityLifecycleCallbacks(ActivityLifecycleCallbacks callback) { synchronized (mActivityLifecycleCallbacks) { mActivityLifecycleCallbacks.add(callback); } } public void unregisterActivityLifecycleCallbacks(ActivityLifecycleCallbacks callback) { synchronized (mActivityLifecycleCallbacks) { mActivityLifecycleCallbacks.remove(callback); } } // ------------------ Internal API ------------------ /* package */ void dispatchActivityCreated(Activity activity, Bundle savedInstanceState) { Object[] callbacks = collectActivityLifecycleCallbacks(); if (callbacks != null) { for (int i=0; i<callbacks.length; i++) { ((ActivityLifecycleCallbacks)callbacks[i]).onActivityCreated(activity, savedInstanceState); } } } /* package */ void dispatchActivityStarted(Activity activity) { Object[] callbacks = collectActivityLifecycleCallbacks(); if (callbacks != null) { for (int i=0; i<callbacks.length; i++) { ((ActivityLifecycleCallbacks)callbacks[i]).onActivityStarted(activity); } } } /* package */ void dispatchActivityResumed(Activity activity) { Object[] callbacks = collectActivityLifecycleCallbacks(); if (callbacks != null) { for (int i=0; i<callbacks.length; i++) { ((ActivityLifecycleCallbacks)callbacks[i]).onActivityResumed(activity); } } } /* package */ void dispatchActivityPaused(Activity activity) { Object[] callbacks = collectActivityLifecycleCallbacks(); if (callbacks != null) { for (int i=0; i<callbacks.length; i++) { ((ActivityLifecycleCallbacks)callbacks[i]).onActivityPaused(activity); } } } /* package */ void dispatchActivityStopped(Activity activity) { Object[] callbacks = collectActivityLifecycleCallbacks(); if (callbacks != null) { for (int i=0; i<callbacks.length; i++) { ((ActivityLifecycleCallbacks)callbacks[i]).onActivityStopped(activity); } } } /* package */ void dispatchActivitySaveInstanceState(Activity activity, Bundle outState) { Object[] callbacks = collectActivityLifecycleCallbacks(); if (callbacks != null) { for (int i=0; i<callbacks.length; i++) { ((ActivityLifecycleCallbacks)callbacks[i]).onActivitySaveInstanceState(activity, outState); } } } /* package */ void dispatchActivityDestroyed(Activity activity) { Object[] callbacks = collectActivityLifecycleCallbacks(); if (callbacks != null) { for (int i=0; i<callbacks.length; i++) { ((ActivityLifecycleCallbacks)callbacks[i]).onActivityDestroyed(activity); } } } ...}
然后在Activity的对应的生命周期方法的内部,通过Application来调用对应的dispatchActivityXxxxx方法,从而实现全生命周期的监听
public class Activity extends ContextThemeWrapper implements LayoutInflater.Factory2,Window.Callback, KeyEvent.Callback, OnCreateContextMenuListener, ComponentCallbacks2, Window.OnWindowDismissedCallback, WindowControllerCallback { ... @MainThread @CallSuper protected void onCreate(@Nullable Bundle savedInstanceState) { if (DEBUG_LIFECYCLE) Slog.v(TAG, "onCreate " + this + ": " + savedInstanceState); if (mLastNonConfigurationInstances != null) { mFragments.restoreLoaderNonConfig(mLastNonConfigurationInstances.loaders); } if (mActivityInfo.parentActivityName != null) { if (mActionBar == null) { mEnableDefaultActionBarUp = true; } else { mActionBar.setDefaultDisplayHomeAsUpEnabled(true); } } if (savedInstanceState != null) { Parcelable p = savedInstanceState.getParcelable(FRAGMENTS_TAG); mFragments.restoreAllState(p, mLastNonConfigurationInstances != null ? mLastNonConfigurationInstances.fragments : null); } mFragments.dispatchCreate(); getApplication().dispatchActivityCreated(this, savedInstanceState); if (mVoiceInteractor != null) { mVoiceInteractor.attachActivity(this); } mCalled = true; } @CallSuper protected void onStart() { if (DEBUG_LIFECYCLE) Slog.v(TAG, "onStart " + this); mCalled = true; mFragments.doLoaderStart(); getApplication().dispatchActivityStarted(this); } ... }
三、ActivityLifecycleCallbacks的应用
Application.ActivityLifecycleCallbacks中对应的监听的生命周期方法会在Activity中的生命方法调用父类的方法之后被触发,由源码也可得知。
- 继承Application重写onCreate等方法
- 调用registerActivityLifecycleCallbacks方法注册ActivityLifecycleCallbacks
package com.crazyview.activitylifecycle;import android.app.Activity;import android.app.Application;import android.os.Bundle;import android.util.Log;/** * Created by cmo on 2017/12/23. */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添加额外的代码就可以实现监控
package com.crazyview.activitylifecycle;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(); }}
打开MainActivity时候的运行结果:
finish当前Activity时:
PS:一些有用的adb命令
1、通过adb 命令获取当前运行的Activity
adb shell dumpsys activity | findstr "mFocusedActivity"
2、通过adb 使用命令行截取对应的log并保存到硬盘对应目录下
adb logcat -s tag >d:log.txt
3、将log和当前时间 保存到当前目录下
adb logcat -v time >a.log
4、通过android.app.ActivityManager获取topActivity
public static String getTopActivity(Context context) { android.app.ActivityManager am = (android.app.ActivityManager) context.getSystemService(ACTIVITY_SERVICE); ComponentName cn = am.getRunningTasks(1).get(0).topActivity; return cn.getShortClassName().toString(); }
- Android进阶——借助简单便捷的ActivityLifecycleCallbacks实现全周期监听Activity
- Android中ActivityLifecycleCallbacks监听Activity们的生命周期
- android基础知识---ActivityLifecycleCallbacks监听Activity们的生命周期
- Android 使用ActivityLifecycleCallbacks监听自己应用Activity的生命周期
- Activity生命周期监听接口:ActivityLifecycleCallbacks
- android关于-->ActivityLifecycleCallbacks接口 的简单认识
- ActivityLifecycleCallbacks——追踪Activity生命周期
- Android 便捷的方式实现Activity变暗的效果
- Android之ActivityLifecycleCallbacks的得到当前的activity的状态
- 借助Intent实现Android工程中Activity之间Java对象的传递——实现Serializable接口
- 借助Intent实现Android工程中Activity之间Java对象的传递——实现Parcelable接口
- 借助Intent实现Android工程中Activity之间Java对象的传递——实现Parcelable接口
- ActivityLifecycleCallbacks管理某些Aty的周期
- Android 集中处理Activity的生命周期事件: Application.ActivityLifecycleCallbacks
- Android进阶——布局优化之灵活借助ViewStub实现懒加载
- Android的Activity的周期
- Android进阶——借助强大Span家族增添丰富的特效及格式化字符串
- Android基础之Android的Activity周期
- 【架构】了解微服务
- Windows桌面应用程序(1-2-1-1st) 准备你的开发环境
- 面试小故事
- 【MySQL】20个经典面试题
- JAVAWEB第七天java基础加强(二)
- Android进阶——借助简单便捷的ActivityLifecycleCallbacks实现全周期监听Activity
- 利用Jenkins玩转Android自动打包发包
- swap字符串浅谈
- 第八章习题
- 做一个随手做笔记的人
- 算法第4版(完整中文版)
- apk反编译和AS基本混淆规则
- JavaEE——JSP标签
- 测试软件_中英文对照