Activity/Fragment的生命周期每个Android的开发人员几乎每一天都要打交道,其重要性不言而喻。那么你知道几种监听回调的方法呢:直接重写Activity/Fragment生命周期方法?经过Application#registerActivityLifecycleCallbacks()
/FragmentManager#registerFragmentLifecycleCallbacks()
注册回调?实现LifecycleObserver
接口?继承BaseActivity/BaseFragment?方法多多,让咱们逐条一块儿展开看看吧! #1.直接重写Activity/Fragment生命周期方法 这里展开就有些老生常谈了。但仍是有一点值得一提,那就是Android几乎每个生命周期回调都会要求调用父类方法,若是不调用将会报错,而检测是否调用的核心就是Activity.mCalled
变量,经过对该变量的判断,即可知道是否调用了父类方法。固然针对编译器的检测,则是经过@CallSuper
注解实现的。 ###优势:可以覆盖到全部暴露的生命周期方法。 ###缺点:仅能针对本身工程的Activity进行覆写,拥有必定的局限性。 #2.registerLifecycleCallbacks ##a.添加Activity回调 Application#registerActivityLifecycleCallbacks()
这一API是在API Level 14后添加的。经过该方法,咱们能够传递一个ActivityLifecycleCallbacks
的实例,该接口声明以下:android
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);
}
复制代码
该方法是一个线程安全的方法,经过该方法添加的监听器,都存储在Application
的mActivityLifecycleCallbacks
这一ArrayList中。那么callbacks的对应方法又是在什么时候调用的呢?答案就在Activity
中。以onActivityCreated()
回调为例:安全
protected void onCreate(@Nullable Bundle savedInstanceState) {
// ...省略一段代码
mFragments.dispatchCreate();
getApplication().dispatchActivityCreated(this, savedInstanceState);
if (mVoiceInteractor != null) {
mVoiceInteractor.attachActivity(this);
}
mRestoredFromBundle = savedInstanceState != null;
mCalled = true;
}
复制代码
关键就在这一行getApplication().dispatchActivityCreated(this, savedInstanceState);
。经过查看源码咱们发现,Application
中一一声明了与ActivityLifecycleCallbacks中方法对应的dispatchActivityXXX()
方法,以Application#dispatchActivityCreated()
为例:app
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);
}
}
}
复制代码
Application
会遍历这一时刻添加的全部ActivityLifecycleCallbacks
并回调对应的生命周期方法。同时咱们也发现,这一方式没法作到在Activity
的声明周期调用以前作一些事情,由于回调生在在supert.onXXX()
中。 ##b.添加Fragment回调 FragmentManager#registerFragmentlifecyclecallbacks()
这一API是在support library version 25.1.0中添加的。咱们能够经过传递一个``类的实现类以及一个boolean类型的变量来实现生命周期的监听,该抽象类声明以下:框架
public abstract static class FragmentLifecycleCallbacks {
public void onFragmentPreAttached(@NonNull FragmentManager fm, @NonNull Fragment f, @NonNull Context context) {}
public void onFragmentAttached(@NonNull FragmentManager fm, @NonNull Fragment f, @NonNull Context context) {}
public void onFragmentPreCreated(@NonNull FragmentManager fm, @NonNull Fragment f, @Nullable Bundle savedInstanceState) {}
public void onFragmentCreated(@NonNull FragmentManager fm, @NonNull Fragment f, @Nullable Bundle savedInstanceState) {}
public void onFragmentActivityCreated(@NonNull FragmentManager fm, @NonNull Fragment f, @Nullable Bundle savedInstanceState) {}
public void onFragmentViewCreated(@NonNull FragmentManager fm, @NonNull Fragment f, @NonNull View v, @Nullable Bundle savedInstanceState) {}
public void onFragmentStarted(@NonNull FragmentManager fm, @NonNull Fragment f) {}
public void onFragmentResumed(@NonNull FragmentManager fm, @NonNull Fragment f) {}
public void onFragmentPaused(@NonNull FragmentManager fm, @NonNull Fragment f) {}
public void onFragmentStopped(@NonNull FragmentManager fm, @NonNull Fragment f) {}
public void onFragmentSaveInstanceState(@NonNull FragmentManager fm, @NonNull Fragment f, @NonNull Bundle outState) {}
public void onFragmentViewDestroyed(@NonNull FragmentManager fm, @NonNull Fragment f) {}
public void onFragmentDestroyed(@NonNull FragmentManager fm, @NonNull Fragment f) {}
public void onFragmentDetached(@NonNull FragmentManager fm, @NonNull Fragment f) {}
}
复制代码
值得注意的是,相比Application
的方法相比,FragmentManager
的方法多了一个参数:boolean recursive
,若是该参数为true
,则会为全部子孙Fragment也注册回调。 首先,Fragment
的生命周期由FragmentManager
经过moveToState()
方法调用。一样,这里以onFragmentCreated
为例,其调用流程以下: moveToState()
-> dispatchOnFragmentCreated()
,dispatchOnFragmentCreated()
代码:ide
void dispatchOnFragmentCreated(@NonNull Fragment f, @Nullable Bundle savedInstanceState, boolean onlyRecursive) {
// ...省略一段代码
// 遍历callback回调声明周期方法
for (FragmentLifecycleCallbacksHolder holder : mLifecycleCallbacks) {
if (!onlyRecursive || holder.mRecursive) {
holder.mCallback.onFragmentCreated(this, f, savedInstanceState);
}
}
}
复制代码
到这里咱们能够发现,与ActivityLifecycleCallbacks同样,这一方式一样在onXXX()
方法以后进行。 综上所属,这种方式的优缺点以下: ###优势:函数
LifecycleObserver
该方法是支持库中的类,现已嵌入androidX包中。该接口声明以下:public interface LifecycleObserver {}
复制代码
能够看到,这就是一个空接口,他的意义就是标记类,由于仅仅实现该方法并不能监控任何生命周期回调。为了监控生命周期,咱们还须要配合@OnLifecycleEvent
注解一同食用:post
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface OnLifecycleEvent {
Lifecycle.Event value();
}
复制代码
该注解接收一个Lifecycle.Event
类型的参数,这是一个枚举类,声明了能够监控到的生命周期变动事件:this
public enum Event {
ON_CREATE,
ON_START,
ON_RESUME,
ON_PAUSE,
ON_STOP,
ON_DESTROY,
ON_ANY
}
复制代码
其中值得说明的是ON_ANY
,该值表示任何变动事件都将回调。完整的例子以下:spa
class LifecycleListener: LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_ANY)
fun onStateChanged(owner:LifecycleOwner,event:Lifecycle.Event){
Log.e("LifecycleListener","owner $owner,event $event")
}
@OnLifecycleEvent(Lifecycle.Event.ON_ANY)
fun onStateChanged(owner:LifecycleOwner){
Log.e("LifecycleListener","owner $owner")
}
@OnLifecycleEvent(Lifecycle.Event.ON_ANY)
fun onStateChanged(){
Log.e("LifecycleListener","called")
}
}
复制代码
须要注意两点:线程
LifecycleObserver
的类,必须拥有一个无参的构造函数;@OnLifecycleEvent
注解的方法,参数能够有0-2个,其中1-2的参数类型,必须按如上声明,不然会报错(由于系统只会按照上述顺序传参) 接下来还有最后一步:注册观察者!class TestActivity : BaseActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// 添加Observer
lifecycle.addObserver(LifecycleListener())
}
}
复制代码
###ps:Fragment
与Activity
使用方式相同 这一步是经过调用Lifecycle#addObserver()
实现的,对于ComponentActivity
而言,实际调用的是LifecycleRegistry#addObserver()
方法。 ##优势: