GVKun编程网logo

Google I/O Android 官方新体系架构之:Lifecycle(安卓谷歌构架)

1

在本文中,我们将给您介绍关于GoogleI/OAndroid官方新体系架构之:Lifecycle的详细内容,并且为您解答安卓谷歌构架的相关问题,此外,我们还将为您提供关于AndroidArchitec

在本文中,我们将给您介绍关于Google I/O Android 官方新体系架构之:Lifecycle的详细内容,并且为您解答安卓谷歌构架的相关问题,此外,我们还将为您提供关于Android Architecture Components 系列(二) LifeCycle、Android Fragment Lifecycle、Android Jetpack 之 Lifecycle - 2、Android Jetpack 之 Lifecycle - 2,已开源的知识。

本文目录一览:

Google I/O Android 官方新体系架构之:Lifecycle(安卓谷歌构架)

Google I/O Android 官方新体系架构之:Lifecycle(安卓谷歌构架)

Google I/O Android 官方新体系架构之:Lifecycle


Google 官方在 I/O 大会中引入一些列 Android 新的体系架构内容,其中有一个是 Android 的 Lifecycle。Lifecycle 实现的一个重要目的,是实现 Android 的与 Activity 和 Fragment 生命周期相关的逻辑控制进一步的解耦。简单的理解,以前因为要写于 Android activity 和 fragment 生命周期相关的控制逻辑时候,不得不在 activity 或者 fragment 的 onCreate,onStart,onResume 里面塞进自己的代码,这样一个结果和现象就是 activity 或者 fragment 里面本身的代码量会越来越多,体型越来越臃肿。
Lifecycle 实现的目的就是专注于 activity 或者 fragment 生命周期的维护管理,相当于与 activity 或者 fragment 并行一条生命周期线,在并行的生命周期线里面可以实时维护与 activity 和 fragment 生命周期相关的逻辑,而不必再在 activity 或者 fragment 里面塞代码。

给出一个具体的例子。


首先要引入 Lifecycle。两步:

第一步,需要在项目的 build.gradle 里面按照 Google 官方手册配置 repositories 的 maven: maven {url ''https://maven.google.com''} 。但是这样因为墙的原因,难以同步代码更新引用,需要把 repositories 的 maven 变一个变成这样:

allprojects {
    repositories {
        maven { url ''https://dl.google.com/dl/android/maven2'' }
        jcenter()
    }
}


第二步,添加 dependencies 引用:
compile "android.arch.lifecycle:extensions:1.0.0-alpha4"
    compile "android.arch.persistence.room:runtime:1.0.0-alpha4"
    annotationProcessor "android.arch.lifecycle:compiler:1.0.0-alpha4"
    annotationProcessor "android.arch.persistence.room:compiler:1.0.0-alpha4"



下面可以实现 Lifecycle。
写一个代码例子说明。现在有一种需求,假设自定义一个 View,在这个自定义的 view 里面,要根据所依赖的 activity 生命周期切换方法实现不同的逻辑控制代码。
写一个自定义的 view,假设就是一个 TextView:
package zhangphil.test;

import android.arch.lifecycle.Lifecycle;
import android.arch.lifecycle.LifecycleObserver;
import android.arch.lifecycle.OnLifecycleEvent;
import android.content.Context;
import android.util.AttributeSet;
import android.support.v7.widget.AppCompatTextView;


import static android.arch.lifecycle.Lifecycle.State.STARTED;

/**
 * Created by Phil on 2017/8/10.
 */

public class TestClass extends AppCompatTextView implements LifecycleObserver {
    private final String TAG = "绑定生命周期";

    private boolean enable;
    private Lifecycle lifecycle;

    private StringBuffer buf;

    public TestClass(Context context, AttributeSet attrs) {
        super(context, attrs);
        buf = new StringBuffer();
    }

    public void setLifecycle(Lifecycle lifecycle) {
        this.lifecycle = lifecycle;
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    public void create() {
        if (enable) {
            buf.append(System.currentTimeMillis() + "-creat\n");
            this.setText(buf);
        }
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    public void start() {
        if (enable) {
            buf.append(System.currentTimeMillis() + "-start\n");
            this.setText(buf);
        }
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    public void resume() {
        if (enable) {
            buf.append(System.currentTimeMillis() + "-resume\n");
            this.setText(buf);
        }
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    public void pause() {
        if (enable) {
            buf.append(System.currentTimeMillis() + "-pause\n");
            this.setText(buf);
        }
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    public void stop() {
        if (enable) {
            buf.append(System.currentTimeMillis() + "-stop\n");
            this.setText(buf);
        }
    }

    public void setLifecycleEanable(boolean b) {
        enable = b;

        if (lifecycle.getCurrentState().isAtLeast(STARTED)) {
            //在这里做一些逻辑判断
        }
    }
}


然后写在布局里面:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="zhangphil.test.MainActivity">

    <zhangphil.test.TestClass
        android:id="@+id/test_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</RelativeLayout>


在 main activity 里面添加以下代码,然后就实现了自定义的 view,在脱离了原有的 activity 后,能够在自己的代码块中,并行的和 activity 实现生命周期相关的控制逻辑。
package zhangphil.test;

import android.arch.lifecycle.LifecycleRegistry;
import android.arch.lifecycle.LifecycleRegistryOwner;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;


public class MainActivity extends AppCompatActivity implements LifecycleRegistryOwner {

    private LifecycleRegistry lifecycleRegistry = new LifecycleRegistry(this);

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        TestClass testClass = (TestClass) findViewById(R.id.test_view);
        testClass.setLifecycle(getLifecycle());

        getLifecycle().addObserver(testClass);
        testClass.setLifecycleEanable(true);
    }

    @Override
    public LifecycleRegistry getLifecycle() {
        return lifecycleRegistry;
    }
}



代码运行结果,反复的按 HOME 键,然后再调出应用的输出结构:

Android Architecture Components 系列(二) LifeCycle

Android Architecture Components 系列(二) LifeCycle

Handling LifeCycle
android.arch.lifecycle 提供的类和接口,让使用者构建能够感知生命周期。
Lifecycle is a class that holds the information about the lifecycle state of a component (like an activity or a fragment) and allows other objects to observe this state.
    根据 Activity or fragment 的生命周期自行调整类的行为通过观察其状态
Lifecycle uses two main enumerations to track the lifecycle status for its associated component:
 
    AAC 中提供了 LifeCycle 使用枚举类来解决生命周期管理问题。
  •       持有 Activity/Fragment 生命周期类
  •       通过接口 LifecycleRegistryOwner /LifecycleObserver 注解事件 @OnLifecycleEvent (),以及外部调用观察者模式 addObserver (mTx),来完成将 (Activity/Fragment)” 生命周期” 共享给其他组件这么一件事
  •     事件
    生命周期事件由系统来分发,这些事件对应与 Activity 和 Fragment 的生命周期函数
    (ON_CREATE,ON_START,ON_RESUME,ON_PAUSE,ON_STOP,ON_DESTROY)
  •      状态
    LifeCycle 的状态,用于追踪 lifecycle 对象: (INITIALIZED,DESTROYED,CREATED,STARTED,RESUMED)
 
ps:在 STARTED 和 RESUMED 状态是处于活跃状态,只有在这两个状态下 LivaData 是会通知数据变化的。
 
 
 
ps 考虑一个问题: 
LifeCycle 是如何感知到 Activity 或是 Fragment 的生命周期的呢?
 
因为 AAC 是基于 MVVM 架构的所以首先开一下 MVP 和 MVVM 的感知生命周期操作。
 
(1)MVP 感知生命周期的方法
    最开始的 attach 和 detach ,通过 Activity 或是 Fragment 中生命周期函数去关联 Presenter,之后判断 View 是否是 Active 的来决定是否更新 Ui。因为 Retrofit 和 RxJava 的兴起,可以将 Presenter 中的动作变成一个流事件。通过 RxJava 特效通过解除订阅的方式来控制 Presenter 中的更新 Ui 的动作。后面有出了 RxLifecycle,通过细微控制到每一个生命周期函数,更进一步的感知处理每个生命周期函数。
 
(2)MVVM 感知生命周期的方法
创造一个 MVVM ViewModel 接口 ,里面包含所有的生命周期回掉的方法,然后在 Aor f 中的各个生命周期函数中调用。
 
(3)官方的 MVVM 感知生命周期的方法
在《使用 ContentProvider 初始化你的 Library》 一文中,作者提到使用了 ContentProvider 进行 library 的初始化,并通过其控制生命周期函数
http://zjutkz.net/2017/09/11/%E4%B8%80%E4%B8%AA%E5%B0%8F%E6%8A%80%E5%B7%A7%E2%80%94%E2%80%94%E4%BD%BF%E7%94%A8ContentProvider%E5%88%9D%E5%A7%8B%E5%8C%96%E4%BD%A0%E7%9A%84Library/
 
LifeCycle 源码分析:
<provider 
android:name = “android.arch.lifecycle.LifecycleRuntimeTrojanProvider"
android:exported = “fasle”
android:multiporcess = “true”
android:authoritites = "com.example.hbl.mbbm.lifecycle-trojan"
/>
 
@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
public class LifecycleRuntimeTrojanProviderextends ContentProvider {
    @Override
    public boolean onCreate() {
       LifecycleDispatcher .init (getContext () ); // 初始化生命周期控制的方法
        ProcessLifecycleOwner.init( getContext() );
        return true;
        }
  }
在 LifecycleDispatcher () 方法中 又是如何操作的呢?
     Class LifecycleDispatcher{
            private static final String REPORT_FRAGMENT_TAG = “android.arch.lifecycle"
                            + “.LifecycleDispatcher.report_fragment_tag” ;
            private static AtomicBooleansInitialized= new AtomicBoolean ( false);
            
            static void init (Context context) {
                if(sInitialized .getAndSet (true) ){
                        return ;
               }else {
                 ( (Application)context .getApplicationContext() ). registerActivityLifecycleCallbacks
                                                                                             (new DispatcherActivityCallback());
            }
        }
解析:通过 AtomicBoolean 来控制初始化一次,之后获取 ApplicationContext 并设置 ActivityLifecycleCallback 回调。
    ps:AtomicBoolean 函数在退出 app 的时候可以用到
 
在 DispatcherActivityCallback 中:
在 DispatcherActivityCallback () 构造函数中
1、创建了一个 FragmentCallback 对象,用于设置 Fragment 的生命周期。
2、在 onActivityCreated () 函数中 instanceof 一个 FragmentActivity,注入一股 ReportFragment 到当前 Activity
3、在 ReportFragment 中,将这个 Fragment 添加到当前 Activity 中,让当前的 fragment 绑定到 Activity 的生命周期中
 
4、之后通过 onActivityCreate () 函数中的 dispatch () 方法把当前生命周期分发到对应的 LifecycleOwner 中
5、通过这种方法,给 Activity or Fragment 添加其他额外的 fragment,来获取当前的 Activity 或是 Fragment 的生命周期。然后判断当前的 Activity 或是 Fragment 是否是 LifeCycleRegistryOwner 的。如果是,那么就分发当前的生命周期事件到当前的 Owner 中,以达到生命周期的传递操作
 
  • 官方 LifeCycle 的使用案例:
(一)创建监听器
classMyLocationListener{
    publicMyLocationListener(Contextcontext,Callbackcallback){
        // ...
    }
    voidstart(){
        // connect to system location service
    }
    voidstop(){
       // disconnect from system location service
    }
}
在需要的 Activity 中绑定监听器
privateMyLocationListenermyLocationListener;
@Override
    publicvoidonCreate(...){
        myLocationListener =newMyLocationListener(this,(location)->{
            // update UI
        });
    }
 @Override
    publicvoidonStart(){
        super.onStart();
        myLocationListener.start();
        // manage other components that need to respond
        // to the activity lifecycle
    }
    @Override
    publicvoidonStop(){
        super.onStop();
        myLocationListener.stop();
        // manage other components that need to respond
        // to the activity lifecycle
    }
 
 
(二)创建观察者对象 
publicclassMyObserverimplementsLifecycleObserver{
    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    publicvoidconnectListener(){
        ...
    }
   @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    publicvoiddisconnectListener(){
        ...
    }
}
myLifecycleOwner.getLifecycle().addObserver(newMyObserver());
(三)实现 LifeCycleOwner 绑定 Activity 或是 Fragment 生命周期
publicclassMyActivityextendsActivityimplementsLifecycleOwner{
    privateLifecycleRegistrymLifecycleRegistry;
    @Override
    protectedvoidonCreate(BundlesavedInstanceState){
        super.onCreate(savedInstanceState);
        mLifecycleRegistry =newLifecycleRegistry(this);
        mLifecycleRegistry.markState(Lifecycle.State.CREATED);
    }
    @Override
    publicvoidonStart(){
        super.onStart();
        mLifecycleRegistry.markState(Lifecycle.State.STARTED);
    }
    @NonNull
    @Override
    publicLifecyclegetLifecycle(){
        returnmLifecycleRegistry;
    }
}
 
  • 一个有关 LifeCycle 的小 Ex:
    1、定义一个类实现 LifeCycleObserver 方法 
    2、定义 2 个状态变量 
    3、自定义类实现 LifecycleObserver 接口,并添加 Lifecycle 的生命周期绑定注解
class MyView extends TextView implements LifecycleObserver{
 
private boolean lifeCycleEnable;
private Lifecycle lifecycle;
// 添加构造方法
public boolean isLifeCycleEnable() {
    return lifeCycleEnable;
}
 
public void setLifeCycleEnable(boolean lifeCycleEnable) {
    this.lifeCycleEnable = lifeCycleEnable;
}
public Lifecycle getLifecycle() {
    return lifecycle;
}
// ****************** lifeCycle 生命周期函数事件 ******************
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
public void create() {
    if (lifeCycleEnable) {
        String text = System.currentTimeMillis() + "-create/n";
        Log.i(TAG, text);
        this.setText(text);
        }
    }
// 同理 Lifecycle.Event.ON_其他事件 ON_START 、ON_PAUSE、ON_STOP、ON_RESUME、ON_DESTROY、ON_ANY
}    
 
在 Activity 中的使用:
publicclass XActivity extends AppCompatActivity implements LifecycleRegistryOwner {
    privateLifecycleRegistry lifecycleRegistry =newLifecycleRegistry(this);
            // 在 onCreate()函数中初始化控件 mtx
            mtx .setLifecycle(getLifecycle()); 
//lifecycle 观察者  LifecycleObserver:自定义的类 MyView
//lifecycle 注册拥有者 LifecycleRegistryOwner:XActivity
            getLifecycle ().addObserver (mtx); // 添加观察者角色
            mtx .setLifeCycleEnable(true);    
        @Override 
     public LifecycleRegistry getLifecycle() {
             return lifecycleRegistry; 
        }
}
 
按 home 键进行观察日志:
creat -> start -> resume -> pause -> stop -> start -> resume
02-24 16:18:31.188 4694-4694/proxy.lifecycledemo E/MyView: Hello World!-creat
02-24 16:18:31.198 4694-4694/proxy.lifecycledemo E/MyView:-start
02-24 16:18:31.198 4694-4694/proxy.lifecycledemo E/MyView:-resume
02-24 16:32:46.058 4694-4694/proxy.lifecycledemo E/MyView:-pause
02-24 16:32:46.798 4694-4694/proxy.lifecycledemo E/MyView:-stop
02-24 16:32:47.988 4694-4694/proxy.lifecycledemo E/MyView:-start
02-24 16:32:47.988 4694-4694/proxy.lifecycledemo E/MyView:-resume
 
解析:LifecycleOwner 是一个只有一个方法的接口 getLifecycle (),需要由子类来实现。
        在 Lib 中已经有实现好的子类,我们可以直接拿来使用。比如 LifecycleActivity 和 LifecycleFragment,我们只需要继承此类就行了。
        当然实际开发的时候我们会自己定义 BaseActivity,Java 是单继承模式,那么需要自己实现 LifecycleRegistryOwner 接口。
如下所示即可,代码很近简单
public class BaseFragment extends Fragment implements LifecycleRegistryOwner {
    LifecycleRegistry lifecycleRegistry = new LifecycleRegistry(this);
    @Override
    public LifecycleRegistry getLifecycle() {
        return lifecycleRegistry;
    }
}
 

Lifecycle 的最佳建议

  • 保持 UI Controllers(Activity/Fragment)中代码足够简洁。一定不能包含如何获取数据的代码,要通过 ViewModel 获取 LiveData 形式的数据。
  • 用数据驱动 UI,UI 的职责就是根据数据改变显示的内容,并且把用户操作 UI 的行为传递给 ViewModel。
  • 把业务逻辑相关的代码放到 ViewModel 中,把 ViewModel 看成是链接 UI 和 App 其他部分的胶水。但 ViewModel 不能直接获取数据,要通过调用其他类来获取数据。
  • 使用 DataBinding 来简化 View(布局文件)和 UI Controllers(Activity/Fragment)之间的代码
  • 如果布局本身太过复杂,可以考虑创建一个 Presenter 类来处理 UI 相关的改变。虽然这么做会多写很多代码,但是对于保持 UI 的简介和可测试性是有帮助的。
  • 不要在 ViewModel 中持有任何 View/Activity 的 context。否则会造成内存泄露。

 

系列文章列表:
   Android Architecture Components 系列(一)初识
   Android Architecture Components 系列(三) LiveData
   Android Architecture Components 系列(四)ViewModel
   Android Architecture Components 系列(五)Room
   Android Architecture Components 系列(六)Paging Library
   Android Architecture Components 系列(七)WorkManager
        Android Architecture Components 系列(八)小结

 

Android Fragment Lifecycle

Android Fragment Lifecycle

According to official doc, Fragment is used to build dynamic User Interfaces. I have heard that some apps just have an Activity with many fragments. That’s crazy! But that is possible.

Fragment should be used within an activity.Actually, Fragments have their own view. A Fragment is added to a ViewGroup inside an activity.And the view of the Fragment is displayed inside this Activity’s ViewGroup.

What is happening when a Fragment is added to the Activity’s ViewGroup?

  • First, The activity obtains a reference to the fragment.
  • Then it gets a reference to its ViewGroup inside which the Fragments’s view will be rendered.
  • Then the activity adds the Fragment.
  • The Fragment starts to create its view and return it to the Activity.
  • Then the View is inserted into the activity’s ViewGroup.
  • Then the Fragment is alive.

The methods of Fragment lifecycle are shown below:

  • onAttach() This method will be called first. It indicates that the Fragment has been attached to the activity.
  • onCreateView() This method will be called ,when it is time for the Fragment to draw its view for the first time.If your Fragment is not going to provide any UI,then you can return null in this method.
  • onViewCreated() This method is called after onCreateView() . It is very useful. You may need to configure the views ,such as with a RecyclerView, and when to set up an adapter.
  • onActivityCreated() This method will be called after onCreate() and onCreateView(). it is to indicate that the activity’s onCreate() has completed. So if there is something that is needed to be initialized in Fragment that depends upon the activity’s onCreate() having completed its work, then you do it here.
  • onStart() This method will be called once the Fragment gets visible.
  • onPause() This method will be called as the user is leaving the Fragment. This is usually where you should commit any changes that should be persisted for the current user session.
  • onStop() This method will be call when the Fragment is go to be stopped.
  • onDestroyView() This method is the counterpart to onCreateView() where we setup the UI of the Fragment. If there are things that are needed to be cleaned up to the UI, you can put up logic here.
  • onDestroy() It is not guaranteed to be called by the system. You should be aware of this.
  • onDetach() This is method is the counterpart to onAttach().It will be called after onDestroy(). It is used to notify that the Fragment has been disassociated from its hosting activity.

Android Fragment classes

  • Fragment : The base class for all fragment deFinitions
  • FragmentManager: The class for interacting with fragment objects inside an activity
  • FragmentTransaction: The class for performing an atomic set of fragment operations.

Let’s talk about the main methods of Fragment!

onCreateView()

override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_home, container, false)
    }

The method gets three parameters:LayoutInflater , ViewGroup, Bundle.
We always use LayoutInflater parameter to create View instance based on layout file. As you can see, following snippet is to create a view based on layout file:

inflater.inflate(R.layout.fragment_home, container, false)

inflate() inflates a new view hierarchy from the specified xml resource.inflate() takes three parameters:

  • resource: ID for an XML layout resource to load. e.g:R.layout.fragment_home .
  • root: It is a ViewGroup into which the fragment’s View is to be inserted .Optional view to be the parent of the generated hierarchy (if attachToRoot is true), or else simply an object that provides a set of LayoutParams values for root of the returned hierarchy (if attachToRoot is false.)
  • attachToRoot : It is a boolean value. Whether the inflated hierarchy should be attached to the root parameter? If false, root is only used to create the correct subclass of LayoutParams for the root view in the XML.and last one is boolean tells us Whether the inflated hierarchy should be attached to the root parameter? If false, root is only used to create the correct subclass of LayoutParams for the root view in the XML.
    You can use fragment in layout xml file. you can also use the following snippet code in Activity to use fragment:
supportFragmentManager
                .beginTransaction()
                .add(R.id.container_end,MenuFragment())
                .commit()

Demo

Android Jetpack 之 Lifecycle - 2

Android Jetpack 之 Lifecycle - 2

原文:https://juejin.cn/post/6974737636330045454

源码分析

生命周期 (Lifecycle )

public abstract class Lifecycle {
    /**
     * Adds a LifecycleObserver that will be notified when the LifecycleOwner changes
     * state.
     * <p>
     * The given observer will be brought to the current state of the LifecycleOwner.
     * For example, if the LifecycleOwner is in {@link State#STARTED} state, the given observer
     * will receive {@link Event#ON_CREATE}, {@link Event#ON_START} events.
     *
     * @param observer The observer to notify.
     */
    @MainThread
    public abstract void addobserver(@NonNull LifecycleObserver observer);

    /**
     * Removes the given observer from the observers list.
     * <p>
     * If this method is called while a state change is being dispatched,
     * <ul>
     * <li>If the given observer has not yet received that event, it will not receive it.
     * <li>If the given observer has more than 1 method that observes the currently dispatched
     * event and at least one of them received the event, all of them will receive the event and
     * the removal will happen afterwards.
     * </ul>
     *
     * @param observer The observer to be removed.
     */
    @MainThread
    public abstract void removeObserver(@NonNull LifecycleObserver observer);

    /**
     * Returns the current state of the Lifecycle.
     *
     * @return The current state of the Lifecycle.
     */
    @MainThread
    @NonNull
    public abstract State getCurrentState();

    // Event 对应 activity 的各个生命周期
	//ON_ANY事件可以代表前面任意一种。
	//举个例子,当Activity的onCreate()生命周期方法被调用时会产生ON_CREATE事件,观察者可以监听该事件以便处理Activity此时的生命周期。
    @SuppressWarnings("WeakerAccess")
    public enum Event {
       ON_CREATE,    //用于匹配生命周期所有者的onCreate事件.
       ON_START,     //用于匹配生命周期所有者的onStart事件.
       ON_RESUME,    //用于匹配生命周期所有者的onResume事件.
       ON_PAUSE,     //用于匹配生命周期所有者的onCreate事件.
       ON_STOP,      //用于匹配生命周期所有者的onStop事件.
       ON_DESTROY,   //用于匹配生命周期所有者的onDestroy事件.
       ON_ANY        //用于匹配生命周期所有者的所有事件.

    }

    /**
     * Lifecycle states. You can consider the states as the nodes in a graph and
     * {@link Event}s as the edges between these nodes.
     */
    @SuppressWarnings("WeakerAccess")
    public enum State {
        /**
         * Destroyed state for a LifecycleOwner. After this event, this Lifecycle will not dispatch
         * any more events. For instance, for an {@link android.app.Activity}, this state is reached
         * <b>right before</b> Activity's {@link android.app.Activity#onDestroy() onDestroy} call.
         */
        DESTROYED,

        /**
         * Initialized state for a LifecycleOwner. For an {@link android.app.Activity}, this is
         * the state when it is constructed but has not received
         * {@link android.app.Activity#onCreate(android.os.Bundle) onCreate} yet.
         */
        INITIALIZED,

        /**
         * Created state for a LifecycleOwner. For an {@link android.app.Activity}, this state
         * is reached in two cases:
         * <ul>
         *     <li>after {@link android.app.Activity#onCreate(android.os.Bundle) onCreate} call;
         *     <li><b>right before</b> {@link android.app.Activity#onStop() onStop} call.
         * </ul>
         */
        CREATED,

        /**
         * Started state for a LifecycleOwner. For an {@link android.app.Activity}, this state
         * is reached in two cases:
         * <ul>
         *     <li>after {@link android.app.Activity#onStart() onStart} call;
         *     <li><b>right before</b> {@link android.app.Activity#onPause() onPause} call.
         * </ul>
         */
        STARTED,

        /**
         * Resumed state for a LifecycleOwner. For an {@link android.app.Activity}, this state
         * is reached after {@link android.app.Activity#onResume() onResume} is called.
         */
        RESUMED;

        /**
         * Compares if this State is greater or equal to the given {@code state}.
         *
         * @param state State to compare with
         * @return true if this State is greater or equal to the given {@code state}
         */
        public boolean isAtLeast(@NonNull State state) {
            return compareto(state) >= 0;
        }
    }
}

Lifecycle 类表示Android应用组件的生命周期,是被观察者。这是一个抽象类,它的实现是 LifecycleRegistry 类。

Lifecycle 对象有3个方法:

  • 添加观察者:void addobserver(LifecycleObserver observer)
  • 删除观察者:void removeObserver(LifecycleObserver observer)。-
  • 获取当前状态:State getCurrentState()

Lifecycle的2个关键方法中参数都是LifecycleObserver

所以在分析 LifecycleRegistry之前我们先看下LifecycleObserver

生命周期观察者 (LifecycleObserver)

LifecycleObserver 基本介绍

标记接口 LifecycleObserver 表示生命周期观察者,是 lifecycle-aware 组件。

public interface LifecycleObserver {

}

这个接口用来声明它的实现类是生命周期观察者 ,我们要在这个类里接收到LifecycleOwner的生命周期变化事件,然后做自身逻辑。

但当我们看到LifecycleObserver这个接口时,第一感觉是比较奇怪:这个接口竟然是空的。那我们如何去接受生命周期变化的事件呢?(通常正常的是回调接口)

其实开头就介绍过用法了,google的做法是配合注解 OnLifecycleEvent 使用,LifecycleObserver 只是起一个声明和约束作用。其内部继承数如下图:

看到这么多类似的接口,我猜或许这是因为生命周期钩子比较多,如果全都放在接口里,那么实现者需要添加很多空实现方法,可阅读性降低。

比如FullLifecycleObserver

interface FullLifecycleObserver extends LifecycleObserver {

    void onCreate(LifecycleOwner owner);

    void onStart(LifecycleOwner owner);

    void onResume(LifecycleOwner owner);

    void onPause(LifecycleOwner owner);

    void onStop(LifecycleOwner owner);

    void onDestroy(LifecycleOwner owner);
}

这个接口就将所有的生命周期函数声明了,如果我们实现这个接口,就得重写所有接口,然而我们不一定要用这么多接口。(其实你想用也用不了,这个接口不是public,我们不能实现)

我们知道用注解的话大多数是反射解析的,这就涉及到性能问题,当然使用apt可以在编译期解决这个问题。这点后文会详细分析。

如果我们不想用注解,又不想一下子实现所有的方法,可以吗? 答案是肯定的。java8的接口default方法。而且google也鼓励我们用这种方式,那就是DefaultLifecycleObserver

DefaultLifecycleObserver

注意:在androidx.lifecycle.Lifecycle类的顶部注释里有一段

/**
 * If you use <b>Java 8 Language</b>, then observe events with {@link DefaultLifecycleObserver}.
 * To include it you should add {@code "androidx.lifecycle:common-java8:<version>"} to your
 * build.gradle file.
 * <pre>
 * class TestObserver implements DefaultLifecycleObserver {
 *     {@literal @}Override
 *     public void onCreate(LifecycleOwner owner) {
 *         // your code
 *     }
 * }
 * </pre>
 * If you use <b>Java 7 Language</b>, Lifecycle events are observed using annotations.
 * Once Java 8 Language becomes mainstream on Android, annotations will be deprecated, so between
 * {@link DefaultLifecycleObserver} and annotations,
 * you must always prefer {@code DefaultLifecycleObserver}.
 * <pre>
 * class TestObserver implements LifecycleObserver {
 *   {@literal @}OnLifecycleEvent(ON_STOP)
 *   void onStopped() {}
 * }
 * </pre>
 * <p>
 * Observer methods can receive zero or one argument.
 * If used, the first argument must be of type {@link LifecycleOwner}.
 * Methods annotated with {@link Event#ON_ANY} can receive the second argument, which must be
 * of type {@link Event}.
 * <pre>
 * class TestObserver implements LifecycleObserver {
 *   {@literal @}OnLifecycleEvent(ON_CREATE)
 *   void onCreated(LifecycleOwner source) {}
 *   {@literal @}OnLifecycleEvent(ON_ANY)
 *   void onAny(LifecycleOwner source, Event event) {}
 * }
 * </pre>
 * These additional parameters are provided to allow you to conveniently observe multiple providers
 * and events without tracking them manually.
 */
public abstract class Lifecycle {
}

意思就是一旦Java 8成为Android的主流,注解将被弃用,所以介于DefaultLifecycleObserver和注解两者之间,更推荐使用 DefaultLifecycleObserver

使用方式如下

implementation "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version"

这个库里其实就一个 DefaultLifecycleObserver.java 接口类。之后我们需要 LifecycleObserver 的时候,一般实现 DefaultLifecycleObserver 接口即可(不用再去直接实现 LifecycleObserver 接口),使用方式变成了下面这样:

class normalActivity : Activity(), LifecycleOwner {

    private var lifecycleRegistry: LifecycleRegistry = LifecycleRegistry(this)

    override fun getLifecycle(): Lifecycle {
        return lifecycleRegistry
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_normal)

        lifecycle.addobserver(object : DefaultLifecycleObserver {
            //下面的方法视自身情况选择实现
            override fun onCreate(owner: LifecycleOwner) {
            }

            override fun onStart(owner: LifecycleOwner) {
            }

            override fun onResume(owner: LifecycleOwner) {
            }

            override fun onPause(owner: LifecycleOwner) {
            }

            override fun onStop(owner: LifecycleOwner) {
            }

            override fun onDestroy(owner: LifecycleOwner) {
            }
        })

    }
}

可以看到,这里我们直接在覆写我们需要的生命周期对应回调方法中写入我们的逻辑代码即可。更加简洁。

LifecycleObserver 之间的转换

我们在使用 LifecycleObserver时,框架内部会将其转换为GenericLifecycleObserver 或其子类。 其转换行为在类 androidx.lifecycle.Lifecycling#getCallback 中。至于这个方法何时触发,我们后续会分析。

现在先看下这个转换过程

@NonNull
    static GenericLifecycleObserver getCallback(Object object) {
         // 如果是 FullLifecycleObserver, 转换为 FullLifecycleObserverAdapter
        if (object instanceof FullLifecycleObserver) {
            return new FullLifecycleObserverAdapter((FullLifecycleObserver) object);
        }

        // 如果是 GenericLifecycleObserver, 不转换
        if (object instanceof GenericLifecycleObserver) {
            return (GenericLifecycleObserver) object;
        }

        final Class<?> klass = object.getClass();
         // 获取转换type, GENERATED_CALLBACK 为使用代码生成,REFLECTIVE_CALLBACK 为使用反射调用
        int type = getobserverConstructorType(klass);
        if (type == GENERATED_CALLBACK) {
            // 采用代码生成
            List<Constructor<? extends GeneratedAdapter>> constructors =
                    sClasstoAdapters.get(klass);
            // 一个构造函数
            if (constructors.size() == 1) {
                GeneratedAdapter generatedAdapter = createGeneratedAdapter(
                        constructors.get(0), object);
                return new SingleGeneratedAdapterObserver(generatedAdapter);
            }
            // 多个构造函数
            GeneratedAdapter[] adapters = new GeneratedAdapter[constructors.size()];
            for (int i = 0; i < constructors.size(); i++) {
                adapters[i] = createGeneratedAdapter(constructors.get(i), object);
            }
            return new CompositeGeneratedAdaptersObserver(adapters);
        }
        // 默认采用反射调用
        return new ReflectiveGenericLifecycleObserver(object);
    }

这个方法的本质,其实就是根据传进来的一个LifecycleObserver 对象,构造出来一个 GenericLifecycleObserver 对象(目前有四个子类:FullLifecycleObserverAdapterSingleGeneratedAdapterObserverCompositeGeneratedAdaptersObserverReflectiveGenericLifecycleObserver),而最终构造出来的对象,就包含了我们创建的 LifecycleObserver 的所有信息,包括各种回调方法等。

当我们通过注解的方式来自定义LifecycleObserver 的时候,按照传统方式,必定要通过反射来对注解进行解析,这样就会对性能造成影响。那么如何优化呢?

  • 通过缓存,来避免每次都通过反射获取构造器。

  • 通过注解处理器,在编译时对那些被@OnLifecycleEvent注解标注的普通方法,进行预处理,生成以“类名_LifecycleAdapter”命名的类,将各种回调方法直接进行逻辑转换,避免反射,进而来提高性能。

我们先看下仅用反射的情况下google是如何优化的

不引入注解处理器时,Lifecycling.getCallback(observer)返回的是ReflectiveGenericLifecycleObserver

package androidx.lifecycle;
class ReflectiveGenericLifecycleObserver implements GenericLifecycleObserver {
    private final Object mWrapped;
    private final CallbackInfo mInfo;

    ReflectiveGenericLifecycleObserver(Object wrapped) {
        mWrapped = wrapped;
        mInfo = ClassesInfoCache.sInstance.getInfo(mWrapped.getClass());
    }

    @Override
    public void onStateChanged(LifecycleOwner source, Event event) {
        mInfo.invokeCallbacks(source, event, mWrapped);
    }
}

这里我们主要关注回调信息 CallbackInfo 的获取方式的代码:

mInfo = ClassesInfoCache.sInstance.getInfo(mWrapped.getClass());

因为反射的代价是比较大的,所以又通过 ClassesInfoCache.java这个单例类,为 ReflectiveGenericLifecycleObserver 类要调用的各种方法的相关信息进行了缓存。

点进去看下它的 getInfo(...) 方法内部,是如何获取方法信息的。

CallbackInfo getInfo(Class klass) {
     	// 先读取缓存
        CallbackInfo existing = mCallbackMap.get(klass);
        if (existing != null) {
            return existing;
        }
        existing = createInfo(klass, null);
        return existing;
    }
private CallbackInfo createInfo(Class klass, @Nullable Method[] declaredMethods) {
    	// 先提取父类的 CallbackInfo    
    	Class superclass = klass.getSuperclass();
        Map<MethodReference, Lifecycle.Event> handlerToEvent = new HashMap<>();
        if (superclass != null) {
            CallbackInfo superInfo = getInfo(superclass);
            if (superInfo != null) {
                handlerToEvent.putAll(superInfo.mHandlerToEvent);
            }
        }

    	// 再提取接口的 CallbackInfo
        Class[] interfaces = klass.getInterfaces();
        for (Class intrfc : interfaces) {
            for (Map.Entry<MethodReference, Lifecycle.Event> entry : getInfo(
                    intrfc).mHandlerToEvent.entrySet()) {
                // verifyAndPutHandler 的作用是实现了接口或者覆写了父类的方法,但是添加了不同的注解事件。
                verifyAndPutHandler(handlerToEvent, entry.getKey(), entry.getValue(), klass);
            }
        }

		// 最后处理类自身的注解
        Method[] methods = declaredMethods != null ? declaredMethods : getDeclaredMethods(klass);
        boolean hasLifecycleMethods = false;
    	// 遍历方法,寻找被 OnLifecycleEvent 注解的方法
        for (Method method : methods) {
            OnLifecycleEvent annotation = method.getAnnotation(OnLifecycleEvent.class);
            if (annotation == null) {
                continue;
            }
            hasLifecycleMethods = true;
            // 处理参数个数,最多两个参数
            Class<?>[] params = method.getParameterTypes();
            int callType = CALL_TYPE_NO_ARG;
            if (params.length > 0) {
                callType = CALL_TYPE_PROVIDER;
                if (!params[0].isAssignableFrom(LifecycleOwner.class)) {
                    throw new IllegalArgumentException(
                            "invalid parameter type. Must be one and instanceof LifecycleOwner");
                }
            }
            Lifecycle.Event event = annotation.value();

            if (params.length > 1) {
                callType = CALL_TYPE_PROVIDER_WITH_EVENT;
                if (!params[1].isAssignableFrom(Lifecycle.Event.class)) {
                    throw new IllegalArgumentException(
                            "invalid parameter type. second arg must be an event");
                }
                if (event != Lifecycle.Event.ON_ANY) {
                    throw new IllegalArgumentException(
                            "Second arg is supported only for ON_ANY value");
                }
            }
            if (params.length > 2) {
                throw new IllegalArgumentException("cannot have more than 2 params");
            }
            MethodReference methodReference = new MethodReference(callType, method);
            verifyAndPutHandler(handlerToEvent, methodReference, event, klass);
        }
        CallbackInfo info = new CallbackInfo(handlerToEvent);
    	// 放入缓存中
        mCallbackMap.put(klass, info);
        mHasLifecycleMethods.put(klass, hasLifecycleMethods);
        return info;
    }

这里,就能看到对注解进行处理的代码了。

我们再看下另一种优化(使用注解处理器)

首先需要在项目模块中引入

annotationProcessor "androidx.lifecycle:lifecycle-compiler:2.0.0"
复制代码

引入这个之后,会自动生成xxx_LifecycleAdapter的文件,路径为

/app/build/generated/source/apt/debug/package_name/LifeObserveCustomName_LifecycleAdapter.java

我们先看下效果:

public class LifecyclePresenter implements LifecycleObserver {
    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    void onCreateInPresenter(@NotNull LifecycleOwner owner){
        System.out.println("on create");
    };

    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    void onDestroyInPresenter(@NotNull LifecycleOwner owner){
        System.out.println("on destory");
    };

    @OnLifecycleEvent(Lifecycle.Event.ON_ANY)
    void onLifecycleChangedInPresenter(@NotNull LifecycleOwner owner,
                            @NotNull Lifecycle.Event event){
        System.out.println("on any");
    }
}

上面的代码在引入注解处理器后,编译项目时就会在build目录下自动生成LifecyclePresenter_LifecycleAdapter

public class LifecyclePresenter_LifecycleAdapter implements GeneratedAdapter {
  final LifecyclePresenter mReceiver;

  LifecyclePresenter_LifecycleAdapter(LifecyclePresenter receiver) {
    this.mReceiver = receiver;
  }

  @Override
  public void callMethods(LifecycleOwner owner, Lifecycle.Event event, boolean onAny,
      MethodCallsLogger logger) {
    boolean hasLogger = logger != null;
    if (onAny) {
      if (!hasLogger || logger.approveCall("onLifecycleChangedInPresenter", 4)) {
        mReceiver.onLifecycleChangedInPresenter(owner,event);
      }
      return;
    }
    if (event == Lifecycle.Event.ON_CREATE) {
      if (!hasLogger || logger.approveCall("onCreateInPresenter", 2)) {
        mReceiver.onCreateInPresenter(owner);
      }
      return;
    }
    if (event == Lifecycle.Event.ON_DESTROY) {
      if (!hasLogger || logger.approveCall("onDestroyInPresenter", 2)) {
        mReceiver.onDestroyInPresenter(owner);
      }
      return;
    }
  }
}

这样通过该依赖库,在编译期把这些标注了的方法进行预处理,然后直接回调这些方法,避免反射,进行提高性能。

我们回头看下Lifecycling.getCallback(observer)方法中是如何判断 是代码生成还是反射调用的代码

 // 获取转换type, GENERATED_CALLBACK 为使用代码生成,REFLECTIVE_CALLBACK 为使用反射调用
 int type = getobserverConstructorType(klass);
 // todo 详细过程暂不分析 下面简要分析下

前面已经分析过,引入注解处理器后,会生成xxx_LifecycleAdapter类,因此如果我们找到这个生成类,则认为采用代码生成方式,否则采取反射调用。

我们看下关键方法

 private static int getobserverConstructorType(Class<?> klass) {
        if (sCallbackCache.containsKey(klass)) {
            return sCallbackCache.get(klass);
        }
        int type = resolveObserverCallbackType(klass);
        sCallbackCache.put(klass, type);
        return type;
    }
private static int resolveObserverCallbackType(Class<?> klass) {
        // anonymous class bug:35073837
        // 匿名内部类采用反射
        if (klass.getCanonicalName() == null) {
            return REFLECTIVE_CALLBACK;
        }
		// 寻找生成类
        Constructor<? extends GeneratedAdapter> constructor = generatedConstructor(klass);
        if (constructor != null) {
            // 找到生成类,则采用 GENERATED_CALLBACK
            sClasstoAdapters.put(klass, Collections
                    .<Constructor<? extends GeneratedAdapter>>singletonList(constructor));
            return GENERATED_CALLBACK;
        }

   		// 是否有方法被 OnLifecycleEvent 注解
        boolean hasLifecycleMethods = ClassesInfoCache.sInstance.hasLifecycleMethods(klass);
        if (hasLifecycleMethods) {
            // 如果有方法被 OnLifecycleEvent 注解, 则采用反射
            return REFLECTIVE_CALLBACK;
        }

    // 如果没有找到生成类,也没有方法被 OnLifecycleEvent 注解。 我们需要去看其父类和接口,或许它们被注解,因此这里又递归调用
        Class<?> superclass = klass.getSuperclass();
        List<Constructor<? extends GeneratedAdapter>> adapterConstructors = null;
        // 如果父类实现了 LifecycleObserver
    	if (isLifecycleParent(superclass)) {
            if (getobserverConstructorType(superclass) == REFLECTIVE_CALLBACK) {
                return REFLECTIVE_CALLBACK;
            }
            adapterConstructors = new ArrayList<>(sClasstoAdapters.get(superclass));
        }

   			// 如果有接口继承了 LifecycleObserver
        for (Class<?> intrface : klass.getInterfaces()) {
            if (!isLifecycleParent(intrface)) {
                continue;
            }
            if (getobserverConstructorType(intrface) == REFLECTIVE_CALLBACK) {
                return REFLECTIVE_CALLBACK;
            }
            if (adapterConstructors == null) {
                adapterConstructors = new ArrayList<>();
            }
            adapterConstructors.addAll(sClasstoAdapters.get(intrface));
        }
        if (adapterConstructors != null) {
            sClasstoAdapters.put(klass, adapterConstructors);
            return GENERATED_CALLBACK;
        }

        return REFLECTIVE_CALLBACK;
    }

因此当我们引入注解处理器后,这里将会返回GENERATED_CALLBACK

Lifecycling.getCallback(observer)方法就会把我们的LifecyclePresenter对象构建成一个 SingleGeneratedAdapterObserver对象返回(因为这里只有一个构造器,如果是多个构造器的话返回CompositeGeneratedAdaptersObserver),之后的 mLifecycleObserver.onStateChanged(owner, event);其实调用的就是SingleGeneratedAdapterObserveronStateChanged(owner, event)方法:

@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
public class SingleGeneratedAdapterObserver implements GenericLifecycleObserver {

    private final GeneratedAdapter mGeneratedAdapter;

    SingleGeneratedAdapterObserver(GeneratedAdapter generatedAdapter) {
        mGeneratedAdapter = generatedAdapter;
    }

    @Override
    public void onStateChanged(LifecycleOwner source, Lifecycle.Event event) {
        mGeneratedAdapter.callMethods(source, event, false, null);
        mGeneratedAdapter.callMethods(source, event, true, null);
    }
}

这里面就可以看到,它调用了内部包裹的类的callMethods(...)方法,也就是我们上面提到的LifecyclePresenter_LifecycleAdaptercallMethonds(...)方法。

综上,再看Lifecycling.getCallback(observer)方法就比较容易理解了。

  1. 如果传进来的的参数 object 是 FullLifecycleObserver 类型,就把它构造成FullLifecycleObserverAdapter 对象,并返回
  2. 如果传进来的的参数 object 是GenericLifecycleObserver类型,直接返回该对象
  3. 如果1,2都不满足,就解析该类的的构造器的Type(该类是反射获取的,还是通过注解处理器生成的)。如果是通过注解处理器生成的类来调用回调函数,就返回一个SingleGeneratedAdapterObserver/CompositeGeneratedAdaptersObserver 对象
  4. 如果以上条件都不满足,就通过反射来调用各回调函数。返回一个 ReflectiveGenericLifecycleObserver 对象

Android Jetpack 之 Lifecycle - 2,已开源

Android Jetpack 之 Lifecycle - 2,已开源

  • The given observer will be brought to the current state of the LifecycleOwner.

  • For example, if the LifecycleOwner is in {@link State#STARTED} state, the given observer

  • will receive {@link Event#ON_CREATE}, {@link Event#ON_START} events.

  • @param observer The observer to notify.

*/

@MainThread

public abstract void addobserver(@NonNull LifecycleObserver observer);

/**

  • Removes the given observer from the observers list.

  • If this method is called while a state change is being dispatched,

    • If the given observer has not yet received that event, it will not receive it.
    • If the given observer has more than 1 method that observes the currently dispatched
    • event and at least one of them received the event, all of them will receive the event and

    • the removal will happen afterwards.

    • @param observer The observer to be removed.

    • */

      @MainThread

      public abstract void removeObserver(@NonNull LifecycleObserver observer);

      /**

      • Returns the current state of the Lifecycle.

      • @return The current state of the Lifecycle.

      */

      @MainThread

      @NonNull

      public abstract State getCurrentState();

      // Event 对应 activity 的各个生命周期

      //ON_ANY事件可以代表前面任意一种。

      //举个例子,当Activity的onCreate()生命周期方法被调用时会产生ON_CREATE事件,观察者可以监听该事件以便处理Activity此时的生命周期。

      @SuppressWarnings(“WeakerAccess”)

      public enum Event {

      ON_CREATE, //用于匹配生命周期所有者的onCreate事件.

      ON_START, //用于匹配生命周期所有者的onStart事件.

      ON_RESUME, //用于匹配生命周期所有者的onResume事件.

      ON_PAUSE, //用于匹配生命周期所有者的onCreate事件.

      ON_STOP, //用于匹配生命周期所有者的onStop事件.

      ON_DESTROY, //用于匹配生命周期所有者的onDestroy事件.

      ON_ANY //用于匹配生命周期所有者的所有事件.

      }

      /**

      • Lifecycle states. You can consider the states as the nodes in a graph and

      • {@link Event}s as the edges between these nodes.

      */

      @SuppressWarnings(“WeakerAccess”)

      public enum State {

      /**

      • Destroyed state for a LifecycleOwner. After this event, this Lifecycle will not dispatch

      • any more events. For instance, for an {@link android.app.Activity}, this state is reached

      • right before Activity’s {@link android.app.Activity#onDestroy() onDestroy} call.

      */

      DESTROYED,

      /**

      • Initialized state for a LifecycleOwner. For an {@link android.app.Activity}, this is

      • the state when it is constructed but has not received

      • {@link android.app.Activity#onCreate(android.os.Bundle) onCreate} yet.

      */

      INITIALIZED,

      /**

      • Created state for a LifecycleOwner. For an {@link android.app.Activity}, this state

      • is reached in two cases:

        • <li>after {@link android.app.Activity#onCreate(android.os.Bundle) onCreate} call;
          
        • <li><b>right before</b> {@link android.app.Activity#onStop() onStop} call.
          

        */

        CREATED,

        /**

        • Started state for a LifecycleOwner. For an {@link android.app.Activity}, this state

        • is reached in two cases:

          • <li>after {@link android.app.Activity#onStart() onStart} call;
            
          • <li><b>right before</b> {@link android.app.Activity#onPause() onPause} call.
            

          */

          STARTED,

          /**

          • Resumed state for a LifecycleOwner. For an {@link android.app.Activity}, this state

          • is reached after {@link android.app.Activity#onResume() onResume} is called.

          */

          RESUMED;

          /**

          • Compares if this State is greater or equal to the given {@code state}.

          • @param state State to compare with

          • @return true if this State is greater or equal to the given {@code state}

          */

          public boolean isAtLeast(@NonNull State state) {

          return compareto(state) >= 0;

          }

          }

          }

          Lifecycle 类表示Android应用组件的生命周期,是被观察者。这是一个抽象类,它的实现是 LifecycleRegistry 类。

          Lifecycle 对象有3个方法:

          • 添加观察者:void addobserver(LifecycleObserver observ![](https://www.hualigs.cn/image/61dba891ed8ee.jpg) er)

          • 删除观察者:void removeObserver(LifecycleObserver observer)。-

          • 获取当前状态:State getCurrentState()

          Lifecycle的2个关键方法中参数都是LifecycleObserver

          所以在分析 LifecycleRegistry之前我们先看下LifecycleObserver

          生命周期观察者 (LifecycleObserver)

          LifecycleObserver 基本介绍

          标记接口 LifecycleObserver 表示生命周期观察者,是 lifecycle-aware 组件。

          public interface LifecycleObserver {

          }

          这个接口用来声明它的实现类是生命周期观察者 ,我们要在这个类里接收到LifecycleOwner的生命周期变化事件,然后做自身逻辑。

          但当我们看到LifecycleObserver这个接口时,第一感觉是比较奇怪:这个接口竟然是空的。那我们如何去接受生命周期变化的事件呢?(通常正常的是回调接口)

          其实开头就介绍过用法了,google的做法是配合注解 OnLifecycleEvent 使用,LifecycleObserver 只是起一个声明和约束作用。其内部继承数如下图:

          看到这么多类似的接口,我猜或许这是因为生命周期钩子比较多,如果全都放在接口里,那么实现者需要添加很多空实现方法,可阅读性降低。

          比如FullLifecycleObserver

          interface FullLifecycleObserver extends LifecycleObserver {

          void onCreate(LifecycleOwner owner);

          void onStart(LifecycleOwner owner);

          void onResume(LifecycleOwner owner);

          void onPause(LifecycleOwner owner);

          void onStop(LifecycleOwner owner);

          void onDestroy(LifecycleOwner owner);

          }

          这个接口就将所有的生命周期函数声明了,如果我们实现这个接口,就得重写所有接口,然而我们不一定要用这么多接口。(其实你想用也用不了,这个接口不是public,我们不能实现)

          我们知道用注解的话大多数是反射解析的,这就涉及到性能问题,当然使用apt可以在编译期解决这个问题。这点后文会详细分析。

          如果我们不想用注解,又不想一下子实现所有的方法,可以吗? 答案是肯定的。java8的接口default方法。而且google也鼓励我们用这种方式,那就是DefaultLifecycleObserver

          DefaultLifecycleObserver

          注意:在androidx.lifecycle.Lifecycle类的顶部注释里有一段

          /**

          • If you use Java 8 Language, then observe events with {@link DefaultLifecycleObserver}.

          • To include it you should add {@code “androidx.lifecycle:common-java8:”} to your

          • build.gradle file.

          • class TestObserver implements DefaultLifecycleObserver {

          • {@literal @}Override
            
          • public void onCreate(LifecycleOwner owner) {
            
          •     // your code
            
          • }
            
          • }

          • If you use Java 7 Language, Lifecycle events are observed using annotations.

          • Once Java 8 Language becomes mainstream on Android, annotations will be deprecated, so between

          • {@link DefaultLifecycleObserver} and annotations,

          • you must always prefer {@code DefaultLifecycleObserver}.

          • class TestObserver implements LifecycleObserver {

          • {@literal @}OnLifecycleEvent(ON_STOP)

          • void onStopped() {}

          • }

          • Observer methods can receive zero or one argument.

          • If used, the first argument must be of type {@link LifecycleOwner}.

          • Methods annotated with {@link Event#ON_ANY} can receive the second argument, which must be

          • of type {@link Event}.

          • class TestObserver implements LifecycleObserver {

          • {@literal @}OnLifecycleEvent(ON_CREATE)

          • void onCreated(LifecycleOwner source) {}

          • {@literal @}OnLifecycleEvent(ON_ANY)

          • void onAny(LifecycleOwner source, Event event) {}

          • }

          • These additional parameters are provided to allow you to conveniently observe multiple providers

          • and events without tracking them manually.

          */

          public abstract class Lifecycle {

          }

          意思就是一旦Java 8成为Android的主流,注解将被弃用,所以介于DefaultLifecycleObserver和注解两者之间,更推荐使用 DefaultLifecycleObserver

          使用方式如下

          implementation “androidx.lifecycle:lifecycle-common-java8:$lifecycle_version”

          这个库里其实就一个 DefaultLifecycleObserver.java 接口类。之后我们需要 LifecycleObserver 的时候,一般实现 DefaultLifecycleObserver 接口即可(不用再去直接实现 LifecycleObserver 接口),使用方式变成了下面这样:

          class normalActivity : Activity(), LifecycleOwner {

          private var lifecycleRegistry: LifecycleRegistry = LifecycleRegistry(this)

          override fun getLifecycle(): Lifecycle {

          return lifecycleRegistry

          }

          override fun onCreate(savedInstanceState: Bundle?) {

          super.onCreate(savedInstanceState)

          setContentView(R.layout.activity_normal)

          lifecycle.addobserver(object : DefaultLifecycleObserver {

          //下面的方法视自身情况选择实现

          override fun onCreate(owner: LifecycleOwner) {

          }

          override fun onStart(owner: LifecycleOwner) {

          }

          override fun onResume(owner: LifecycleOwner) {

          }

          override fun onPause(owner: LifecycleOwner) {

          }

          override fun onStop(owner: LifecycleOwner) {

          }

          override fun onDestroy(owner: LifecycleOwner) {

          }

          })

          }

          }

          可以看到,这里我们直接在覆写我们需要的生命周期对应回调方法中写入我们的逻辑代码即可。更加简洁。

          LifecycleObserver 之间的转换

          我们在使用 LifecycleObserver时,框架内部会将其转换为GenericLifecycleObserver 或其子类。 其转换行为在类 androidx.lifecycle.Lifecycling#getCallback 中。至于这个方法何时触发,我们后续会分析。

          现在先看下这个转换过程

          @NonNull

          static GenericLifecycleObserver getCallback(Object object) {

          // 如果是 FullLifecycleObserver, 转换为 FullLifecycleObserverAdapter

          if (object instanceof FullLifecycleObserver) {

          return new FullLifecycleObserverAdapter((FullLifecycleObserver) object);

          }

          // 如果是 GenericLifecycleObserver, 不转换

          if (object instanceof GenericLifecycleObserver) {

          return (GenericLifecycleObserver) object;

          }

          final Class<?> klass = object.getClass();

          // 获取转换type, GENERATED_CALLBACK 为使用代码生成,REFLECTIVE_CALLBACK 为使用反射调用

          int type = getobserverConstructorType(klass);

          if (type == GENERATED_CALLBACK) {

          // 采用代码生成

          List<Constructor<? extends GeneratedAdapter>> constructors =

          sClasstoAdapters.get(klass);

          // 一个构造函数

          if (constructors.size() == 1) {

          GeneratedAdapter generatedAdapter = createGeneratedAdapter(

          constructors.get(0), object);

          return new SingleGeneratedAdapterObserver(generatedAdapter);

          }

          // 多个构造函数

          GeneratedAdapter[] adapters = new GeneratedAdapter[constructors.size()];

          for (int i = 0; i < constructors.size(); i++) {

          adapters[i] = createGeneratedAdapter(constructors.get(i), object);

          }

          return new CompositeGeneratedAdaptersObserver(adapters);

          }

          // 默认采用反射调用

          return new ReflectiveGenericLifecycleObserver(object);

          }

          这个方法的本质,其实就是根据传进来的一个LifecycleObserver 对象,构造出来一个 GenericLifecycleObserver 对象(目前有四个子类:FullLifecycleObserverAdapterSingleGeneratedAdapterObserverCompositeGeneratedAdaptersObserverReflectiveGenericLifecycleObserver),而最终构造出来的对象,就包含了我们创建的 LifecycleObserver 的所有信息,包括各种回调方法等。

          当我们通过注解的方式来自定义LifecycleObserver 的时候,按照传统方式,必定要通过反射来对注解进行解析,这样就会对性能造成影响。那么如何优化呢?

          • 通过缓存,来避免每次都通过反射获取构造器。

          • 通过注解处理器,在编译时对那些被@OnLifecycleEvent注解标注的普通方法,进行预处理,生成以“类名_LifecycleAdapter”命名的类,将各种回调方法直接进行逻辑转换,避免反射,进而来提高性能。

          我们先看下仅用反射的情况下google是如何优化的

          不引入注解处理器时,Lifecycling.getCallback(observer)返回的是ReflectiveGenericLifecycleObserver

          package androidx.lifecycle;

          class ReflectiveGenericLifecycleObserver implements GenericLifecycleObserver {

          private final Object mWrapped;

          private final CallbackInfo mInfo;

          ReflectiveGenericLifecycleObserver(Object wrapped) {

          mWrapped = wrapped;

          mInfo = ClassesInfoCache.sInstance.getInfo(mWrapped.getClass());

          }

          @Override

          public void onStateChanged(LifecycleOwner source, Event event) {

          mInfo.invokeCallbacks(source, event, mWrapped);

          }

          }

          这里我们主要关注回调信息 CallbackInfo 的获取方式的代码:

          mInfo = ClassesInfoCache.sInstance.getInfo(mWrapped.getClass());

          因为反射的代价是比较大的,所以又通过 ClassesInfoCache.java这个单例类,为 ReflectiveGenericLifecycleObserver 类要调用的各种方法的相关信息进行了缓存。

          点进去看下它的 getInfo(...) 方法内部,是如何获取方法信息的。

          CallbackInfo getInfo(Class klass) {

          // 先读取缓存

          CallbackInfo existing = mCallbackMap.get(klass);

          if (existing != null) {

          return existing;

          }

          existing = createInfo(klass, null);

          return existing;

          }

          private CallbackInfo createInfo(Class klass, @Nullable Method[] declaredMethods) {

          // 先提取父类的 CallbackInfo

          Class superclass = klass.getSuperclass();

          Map<MethodReference, Lifecycle.Event> handlerToEvent = new HashMap<>();

          if (superclass != null) {

          CallbackInfo superInfo = getInfo(superclass);

          if (superInfo != null) {

          handlerToEvent.putAll(superInfo.mHandlerToEvent);

          }

          }

          // 再提取接口的 CallbackInfo

          Class[] interfaces = klass.getInterfaces();

        我们今天的关于Google I/O Android 官方新体系架构之:Lifecycle安卓谷歌构架的分享已经告一段落,感谢您的关注,如果您想了解更多关于Android Architecture Components 系列(二) LifeCycle、Android Fragment Lifecycle、Android Jetpack 之 Lifecycle - 2、Android Jetpack 之 Lifecycle - 2,已开源的相关信息,请在本站查询。

        本文标签: