상세한의 라이프 사이클 라이브러리 안드로이드 제트 팩 구성 요소

안드로이드 제트 팩의 구성 요소는,이 라이브러리가 함께 작동하도록 구축 라이브러리의 집합입니다뿐만 아니라,이 라이브러리는 다음 열한 세부 사항을 배우게됩니다 만 사용할 수 있으며, 다음과 같은 소스 버전은 com.android.support:appcompat-v7:28.0입니다 0.0 및 라이브러리 android.arch.lifecycle : 확장 : 1.1.1

라이프 사이클 라이브러리는 작업을 수행하는 데 사용됩니다

어셈블리의 수명주기, 예를 들어 활성 단편을 관리 할 필요가 라이브러리 시스템 프레임 층. 개발자가보다 쉽게 ​​유지 관리 코드를 쉽게하기 위해 바인딩 응용 프로그램이나 조각에서 그들이 필요로하는 구성 요소 및 활동을 관리 할 수 ​​있습니다.

예를 설명하기 위해 어쩌면 조금 추상적는, 예를 들어, 수요가, 단일 인터페이스에서 자주 업데이트 위치 정보를 필요로한다. 활동 중지시 간 때, 당신은 또한 위치를 업데이트 일시 정지해야한다, 또는 활동 도보 파괴 할 때, 당신은 어떤 자원을 확보하고자합니다. 아래에 몇 가지 코드 예제를 해결하기 위해 함께, 귀하의 코드는 다음과 같습니다

class MyLocationListener {
    public MyLocationListener(Context context, Callback callback) { // ... } void start() { // 开始连接位置服务 } void stop() { // 停止连接位置服务 } void destroy(){ //释放资源 } } class MyActivity extends AppCompatActivity { private MyLocationListener myLocationListener; @Override public void onCreate(...) { myLocationListener = new MyLocationListener(this, new Callback(){ //回调更新UI }); } @Override public void onStart() { super.onStart(); myLocationListener.start(); //绑定actiivty的onStart周期函数 } @Override public void onStop() { super.onStop(); myLocationListener.stop(); //绑定actiivty的onStop周期函数 } @Override public void onDestroy() { super.onDestroy(); myLocationListener.destroy(); //绑定actiivty的onDestroy周期函数 } } 复制代码

위의 코드는 좋아 보일 수 있지만, 더 간단한 응용 프로그램 활동 비즈니스 로직이 때, 많은 사용자 지정 구성 요소 및 라이프 사이클 바인딩을 포함 할 수있다, 코드의 장기 축적을 유지하기 어렵다.

다음 코드는 비교 수명주기 작업을 수행 할 라이브러리를 사용에서 살펴 보자 :

class MyLocationListener implements LifecycleObserver{ public MyLocationListener(Context context, Callback callback) { // ... } @OnLifecycleEvent(Lifecycle.Event.ON_START) void start() { // 开始连接位置服务 } @OnLifecycleEvent(Lifecycle.Event.ON_STOP) void stop() { // 停止连接位置服务 } @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY) void destroy(){ //释放资源 } } class MyActivity extends AppCompatActivity { private MyLocationListener myLocationListener; @Override public void onCreate(...) { myLocationListener = new MyLocationListener(this, new Callback(){ //回调更新UI }); getLifecycle().addObserver(myLocationListener); } } 复制代码

MyLocationListener가 LifecycleObserver 달성 적절한 콜백을받을 수 OnLifecycleEvent 대응 방법에 주석을 추가의 활동하지 OnCreate getLifecycle () 메소드를 호출한다. AddObserver (myLocationListener)을 할 수있다. 소스 코드 분석 수명주기 라이브러리의 다음과 같은 조합은이 라이브러리는 더 배울 수 있습니다.

수명주기 및 핵심 클래스 라이브러리 구조

지원 라이브러리 26.1.0 버전과 이후 버전, AppCompatActivity와 조각은 LifecycleOwner을 깨달았다. 클래스 다이어그램은 아래에 도시된다 :

jetpack_lifecycle_01

라이프 사이클의 핵심 라이브러리는 가입자 모델입니다.

LifecycleOberver 클래스 : 그냥 빈 인터페이스, 앤드류스의 라이프 사이클 관찰자,

라이프 사이클 클래스 : 객체 앤드류스의 라이프 사이클을 정의하는 추상 클래스이며, 세 가지 방법, 관찰자가 추가, 제거 관찰자, 현재 상태를 얻을 수있다.

LifecycleOwner 카테고리 : 포트, 앤드류스 라이프 사이클 소유자

LifecycleRegistry : 라이프 사이클 구현 클래스를 추가 구현, 관찰자 ​​파견 상태를 관찰자를 제거

OnLifecycleEvent 주석 처리를 추가, 인터페이스를 구현 LifecycleOberver 사용자 정의 클래스는 수명주기의 각 상태를받을 수 있습니다

public @interface OnLifecycleEvent {
    Lifecycle.Event value();
}

public enum Event { 
    ON_CREATE,
    ON_START,
    ON_RESUME,
    ON_PAUSE,
    ON_STOP,
    ON_DESTROY,
    ON_ANY
}
//Event是Lifecycle内部类一个枚举类, 分别定义了onCreate, onStart, onResume, onPause,onStop,onDestroy, onAny这几个Event

public enum State {
    DESTROYED,
    INITIALIZED,
    CREATED,
    STARTED,
    RESUMED;

    public boolean isAtLeast(@NonNull State state) {
    	return compareTo(state) >= 0;
    }
}//State也是Lifecycle内部类一个枚举类, 定义了INITIALIZED, CREATED, STARTED, RESUMED, DESTROYED几种状态
复制代码

아래 그림과 같이 각 주 및 유통 프로세스 라이프 사이클 이벤트 (공식 웹 사이트 구글 문서에서 그림)


사각형이 열거 상태, 다섯 개 국가의 총, 국가 기록을 나타내고, 다음 파괴 초기화 작성 시작 재개;

위의 화살표 이벤트의 분포를 나타냅니다 :

  • ON_CREATE 이벤트를 배포 할 때 초기화의 상태 - CREATED>;
  • ON_START 이벤트를 배포 할 때, 국가 생성의 -> 시작
  • ON_RESUME 이벤트를 배포 할 때, 시작의 주 -> 재개
  • ON_PAUSE 이벤트를 배포 할 때, 주 재개의 -> 시작
  • ON_STOP 이벤트를 배포 할 때, 주 시작으로 -> CREATED
  • , 주 CREATED의 ON_DESTROY 이벤트를 배포 할 때 -> DESTROYED

국가는 = 시작했을 때, 활동 아마도 ONSTART onPause 호출 또는 호출 한 후, 주 =이 만들 때 더 들렸다 및 일시 중지 상태 상태를 찾을 것입니다, 아마에서 onCreate 호출 후 통화 또는 중지시에서 활동

ComponentActivity 유통 과정 이벤트

촬영 한 부분 ComponentActivity의 키 코드를 다음

public class ComponentActivity extends Activity implements LifecycleOwner{ private LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this); protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); ReportFragment.injectIfNeededIn(this); //利用Fragment来分发 } @CallSuper @Override protected void onSaveInstanceState(Bundle outState) { mLifecycleRegistry.markState(Lifecycle.State.CREATED); //onSaveInstanceState是用来恢复Activity状态的, 这里记录的状态是CREATED super.onSaveInstanceState(outState); } @Override public Lifecycle getLifecycle() { return mLifecycleRegistry; //返回LifecycleRegistry } } 复制代码

키 코드 모습 ReportFragment 종류에 따라 :

    public static void injectIfNeededIn(Activity activity) { // 为当前activity add 一个ReportFragment,用于分发event android.app.FragmentManager manager = activity.getFragmentManager(); if (manager.findFragmentByTag(REPORT_FRAGMENT_TAG) == null) { manager.beginTransaction().add(new ReportFragment(), REPORT_FRAGMENT_TAG).commit(); manager.executePendingTransactions(); } } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); dispatch(Lifecycle.Event.ON_CREATE); //分发ON_CREATE Event } @Override public void onStart() { super.onStart(); dispatch(Lifecycle.Event.ON_START);//分发ON_START Event } @Override public void onResume() { super.onResume(); dispatch(Lifecycle.Event.ON_RESUME);//分发ON_RESUME Event } @Override public void onPause() { super.onPause(); dispatch(Lifecycle.Event.ON_PAUSE);//分发ON_PAUSE Event } @Override public void onStop() { super.onStop(); dispatch(Lifecycle.Event.ON_STOP);//分发ON_STOP Event } @Override public void onDestroy() { super.onDestroy(); dispatch(Lifecycle.Event.ON_DESTROY);//分发ON_DESTROY Event } private void dispatch(Lifecycle.Event event) { Activity activity = getActivity(); // Activity是实现LifecycleOwner接口,这里可以跳过 if (activity instanceof LifecycleRegistryOwner) { ((LifecycleRegistryOwner) activity).getLifecycle().handleLifecycleEvent(event); return; } if (activity instanceof LifecycleOwner) { Lifecycle lifecycle = ((LifecycleOwner) activity).getLifecycle(); if (lifecycle instanceof LifecycleRegistry) { ((LifecycleRegistry) lifecycle).handleLifecycleEvent(event); //最终调用LifecycleRegistry.handleLifecycleEvent(event)处理event分发 } } } 复制代码

ComponentActivity 이벤트 onActivityCreated의 ReportFragment, ONSTART, onResume, 중지시, onPause, 방법들의 OnDestroy 결국 LifecycleRegistry.handleLifecycleEvent 행 (이벤트) 프로세스를 재 기입함으로써, ReportFragment을 첨가하여 분배된다.

배포 프로세스 이벤트의 조각

조각 관련 V4 관련 소스에 잘립니다 다음

    LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this);

    @Override
    public Lifecycle getLifecycle() { return mLifecycleRegistry; } void performCreate(Bundle savedInstanceState) { ... onCreate(savedInstanceState); ... mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_CREATE); } void performStart() { ... onStart(); ... mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START); } void performResume() { ... onResume(); ... mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_RESUME); } void performPause() { mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_PAUSE); ... onPause(); ... } void performStop() { mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_STOP); ... onStop(); ... } void performDestroy() { mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_DESTROY); ... onDestroy(); ... } 复制代码

LifecycleRegistry.handleLifecycleEvent (이벤트) 과정. 자세한 내용은이 클래스를 LifecycleRegistry 위해 나는이 시작되지 않습니다

사용자 정의 LifecycleOwner

지원 라이브러리 26.1.0 이전 버전과 이후 버전을 언급 AppCompatActivity 및 조각은 LifecycleOwner는 여전히 이전 버전 또는 상속 활동을 사용하는 경우, 당신은 활동이나 조각 달성 사용자 정의 할 수 있습니다 깨달았다. 다음과 같이 사용자 정의 코드는 다음과 같습니다

//可以单独引入androidx.lifecycle:lifecycle-runtime:$lifecycle_version库
public class MyActivity extends Activity implements LifecycleOwner { private LifecycleRegistry mLifecycleRegistry; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mLifecycleRegistry = new LifecycleRegistry(this); mLifecycleRegistry.markState(Lifecycle.State.CREATED); } @Override public void onStart() { super.onStart(); mLifecycleRegistry.markState(Lifecycle.State.STARTED); } .... @NonNull @Override public Lifecycle getLifecycle() { return mLifecycleRegistry; } } 复制代码

사용 ProcessLifecycleOwner 앱은 대만의 주위에 전체 프로세스를 모니터링

유통 번, ON_DESTROY는 ON_CREATE 후 이벤트의 분포에주의를 지불하지

public class App extends Application { @Override public void onCreate() { super.onCreate(); ProcessLifecycleOwner.get().getLifecycle().addObserver(new LifecycleObserver() { private static final String TAG = "ProcessLifecycleOwner"; @OnLifecycleEvent(Lifecycle.Event.ON_CREATE) public void onCreate(){ Log.d(TAG, "onCreate: "); //应用启动只被调用一次 } @OnLifecycleEvent(Lifecycle.Event.ON_START) public void onStart(){ Log.d(TAG, "onStart: "); //应用启动会调用一次, 从后台回来也会调用 } @OnLifecycleEvent(Lifecycle.Event.ON_RESUME) public void onResume(){ Log.d(TAG, "onResume: "); //应用启动会调用一次, 从后台回来也会调用 } @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE) public void onPause(){ Log.d(TAG, "onPause: "); //按home键或者切换应用会调用 } @OnLifecycleEvent(Lifecycle.Event.ON_STOP) public void onStop(){ Log.d(TAG, "onStop: "); //按home键或者切换应用会调用 } }); } 复制代码

ON_PAUSE을 참고하기 위해 콜백 지연을 ON_STOP 것, (700) MS의 공식 해상도는 파괴로 인해 그 구성을 변경하지를 보장하는 것입니다 및 재 활동 어떤 이벤트를 배포하지 않습니다. 또 다른 점은, 앱이 멀티 프로세스 응용 프로그램의 경우, ProcessLifecycleOwner은 주요 프로세스를 모니터링하는 데 사용할 수.

자세한 내용은 참조 : developer.android.google.cn/reference/a을 ...

ProcessLifecycleOwner의 작품에 대해 다음 간단히 :

// ProcessLifecycleOwner 关键代码
public class ProcessLifecycleOwner implements LifecycleOwner{ private int mStartedCounter = 0; // 计数器 private int mResumedCounter = 0; // 计数器 void activityResumed() { mResumedCounter++; if (mResumedCounter == 1) { if (mPauseSent) { mRegistry.handleLifecycleEvent(Lifecycle.Event.ON_RESUME); mPauseSent = false; } else { mHandler.removeCallbacks(mDelayedPauseRunnable); } } } void activityPaused() { mResumedCounter--; if (mResumedCounter == 0) { mHandler.postDelayed(mDelayedPauseRunnable, TIMEOUT_MS); } } void attach(Context context) { mHandler = new Handler(); //mRegistry是LifecycleRegistry对象,依靠LifecycleRegistry分发Event,不多说 mRegistry.handleLifecycleEvent(Lifecycle.Event.ON_CREATE); Application app = (Application) context.getApplicationContext(); //利用registerActivityLifecycleCallbacks注册callback监听activity生命周期 //细看activityResumed和activityPaused方法,通过Activity计数法来实现应用前后台的监听 app.registerActivityLifecycleCallbacks(new EmptyActivityLifecycleCallbacks() { @Override public void onActivityCreated(Activity activity, Bundle savedInstanceState) { ReportFragment.get(activity).setProcessListener(mInitializationListener); } @Override public void onActivityPaused(Activity activity) { activityPaused(); } @Override public void onActivityStopped(Activity activity) { activityStopped(); } }); } static void init(Context context) { // 初始化 sInstance.attach(context); } } public class ProcessLifecycleOwnerInitializer extends ContentProvider { @Override public boolean onCreate() { LifecycleDispatcher.init(getContext()); //这是个ContentProvider,在onCreate方法初始化ProcessLifecycleOwner //主进程的第一个ContentProvider.onCreate是比Application.onCreate先调用的 //这个ContentProvider会注册在Androidmenifest中,从而不用再Application中进行ProcessLifecycleOwner初始化 ProcessLifecycleOwner.init(getContext()); return true; } } 复制代码

LifecycleService 사용

LifecycleService 상속 서비스 및 LifecycleOwner을 달성하기 위해, 당신이 사용하는 서비스 상속 LifecycleService을 사용자 정의 할 수 있습니다, 다음 코드 예제입니다 :

public class MyService extends LifecycleService {

    public MyService() {
    }

    @Override
    public void onCreate() {
        super.onCreate();
        getLifecycle().addObserver(new LifecycleObserver() {

            @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
            public void onCreate(){
                Log.d(TAG, "onCreate: ");
            }

            @OnLifecycleEvent(Lifecycle.Event.ON_START)
            public void onStart(){
                Log.d(TAG, "onStart: ");
            }

            @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
            public void onStop(){
                Log.d(TAG, "onStop: ");
            }
            
            @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
            public void onDestroy(){
                Log.d(TAG, "onDestroy: ");
            }

        });
    }
}
复制代码

요약 및 기타 팁

수명주기는 라이브러리 제트 팩은 LifecycleObserver 관찰자에 의해 활동, 조각 및 서비스의 유형과 의존의 수명을 단축 다른 구성 요소를위한 토대를 마련.

  • 확장 : LifecycleService 및 ProcessLifecycleOwner이 android.arch.lifecycle을 소개 할 필요가 사용 com.android.support:appcompat-v7:version에 포함되지 1.1.1 라이브러리,
  • 바람직하게는 라이브러리 라이프 사이클에 사용되는 컴파일러 라이브러리 annotationProcessor APT Gradle을 도입된다 도입 할 때 ": 컴파일러 android.arch.lifecycle 1.1.1"이 상기 라이브러리에 도입되지 않고,이 방법은 달성 대응 주석 @OnLifecycleEvent 반사를 사용하는 이 라이브러리는 컴파일시 클래스에 자동으로 생성됩니다 후 YourObserverName_LifecycleAdapter 0 반사 성능 향상을 구현합니다.

추천

출처www.cnblogs.com/Free-Thinker/p/11496726.html