1. 程式人生 > 其它 >2-1、LifeCycle基本使用

2-1、LifeCycle基本使用

原文連結

1、LifeCycle監聽Activity生命週期

  • 普通元件在使用過程中通常需要依賴於系統元件的生命週期,有時候,我們不得不在系統元件的生命週期回撥方法中,主動去呼叫普通元件的方法,或者對其進行控制,因為普通元件無法獲知系統元件生命週期事件。

傳統寫法

public class LocationActivity extends AppCompatActivity {

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

        //在頁面建立時 初始化定位管理資訊
        initLocation();
    }

    @Override
    protected void onResume() {
        super.onResume();
        ///在頁面顯示時 開始定位
        startLocation();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //在頁面銷燬時停止定位
        stopLocation();
    }
}

LifecycleObserver寫法

  • 繼承LifecycleObserver
  • @OnLifecycleEvent(Lifecycle.Event.ON_CREATE):註解的該方法在Activity的onCreate方法後會被呼叫
  • @OnLifecycleEvent(Lifecycle.Event.ON_RESUME):註解的該方法在Activity的onResume方法後會被呼叫
  • @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY):註解的該方法在Activity的onDestroy方法前會被呼叫
  • MyLocationListener.java
package com.xinhe.testandroid;

import android.util.Log;

import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleObserver;
import androidx.lifecycle.OnLifecycleEvent;

public class MyLocationListener implements LifecycleObserver {
    public static final String TAG = "Location";

    /**
     * 使用註解,使得在create時呼叫
     */
    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    public void initLocation() {
        Log.d(TAG, "initLocation");
    }

    /**
     * 使用註解,使得在resume時呼叫
     */
    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    public void startLocation() {
        Log.d(TAG, "startLocation");
    }

    /**
     * 使用註解,使得在destroy時呼叫
     */
    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    public void stopLocation() {
        Log.d(TAG, "stopLocation");
    }
}
  • getLifecycle().addObserver(myLocationListener);
  • 只需要在Activity中註冊定位物件,就可以在定位物件中,接收到Activity生命週期的變化通知
  • MainActivity.java
package com.xinhe.testandroid;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "Location";

    public MyLocationListener myLocationListener;

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

        //初始化定位物件
        myLocationListener = new MyLocationListener();
        getLifecycle().addObserver(myLocationListener);

        Log.d(TAG,"onCreate");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.d(TAG,"onResume");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d(TAG,"onDestroy");
    }
}
  • 執行結果
    • onCreate之後會自動呼叫initLocation
    • onResume之後會自動呼叫startLocation
    • stopLocation方法會在onDestroy方法之前呼叫

Location: onCreate
Location: initLocation
Location: onResume
Location: startLocation
// 退出應用後
Location: stopLocation
Location: onDestroy

2、LifeCycle監聽Fragment生命週期

  • 和Activity基本一致
public class BlankFragment extends Fragment {

    private static final String TAG = "Fragment";

    public MyLocationListener myLocationListener;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d(TAG,"onCreate");
        //初始化定位物件
        myLocationListener = new MyLocationListener();
        getLifecycle().addObserver(myLocationListener);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_blank, container, false);
    }

    @Override
    public void onResume() {
        super.onResume();
        Log.d(TAG,"onResume");
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.d(TAG,"onDestroy");
    }
}

3、LifeCycle監聽Service生命週期

  • 監聽service的生命週期需要新增依賴

implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'

  • 建立Service時,繼承LifecycleService的MyService.java
public class MyService extends LifecycleService {

    private static final String TAG = "MyServiceObserver";

    private MyServiceObserver myServiceObserver;

    public MyService(){
        myServiceObserver = new MyServiceObserver();
        getLifecycle().addObserver(myServiceObserver);
    }

    @Override
    public void onCreate() {
        super.onCreate();
        Log.d(TAG,"onCreate");
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.d(TAG,"onDestroy");
    }
}
  • MyServiceObserver.java
public class MyServiceObserver implements LifecycleObserver {

    private static final String TAG = "MyServiceObserver";

    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    public void startService(){
        Log.d(TAG,"在MyServiceObserver中監聽到Service啟動 ");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    public void stopService(){
        Log.d(TAG,"在MyServiceObserver中監聽到Service停止 ");
    }
}
  • MainActivity.java兩個啟動停止service按鈕
public class MainActivity extends AppCompatActivity {

    private static final String TAG = "Location";

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

    public void start(View view) {
        Intent intent = new Intent(MainActivity.this,MyService.class);
        startService(intent);
    }

    public void stop(View view) {
        Intent intent = new Intent(MainActivity.this,MyService.class);
        stopService(intent);
    }
}
  • 執行結果
  • MyService是被觀察者,MyServiceObserver是觀察者,當被觀察者MyService的生命週期發生變化時,回撥觀察者MyServiceObserver的指定方法

// startservice
MyServiceObserver: onCreate
MyServiceObserver: 在MyServiceObserver中監聽到Service啟動

// stopservice
MyServiceObserver: 在MyServiceObserver中監聽到Service停止
MyServiceObserver: onDestroy

4、LifeCycle監聽Application生命週期

  • 監聽app的生命週期需要新增依賴,和監聽service的依賴相同

implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'

  • MyApp.java
  • ProcessLifecycleOwner
public class MyApp extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        ProcessLifecycleOwner.get().getLifecycle().addObserver(new ApplicatonOberver());
    }

}
  • ApplicatonOberver.java
package com.xinhe.testandroid;

import android.util.Log;

import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleObserver;
import androidx.lifecycle.OnLifecycleEvent;

class ApplicatonOberver implements LifecycleObserver {

    private static final String TAG = "ApplicatonOberver";

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

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

    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    public void onResume(){
        Log.d(TAG,"onResume in ApplicatonOberver");
    }


    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    public void onPause(){
        Log.d(TAG,"onPause in ApplicatonOberver");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    public void onStop(){
        Log.d(TAG,"onStop in ApplicatonOberver");
    }

    /**
     * 該方法永遠不會被呼叫,因為系統不會分發ON_DESTROY事件
     */
    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    public void onDestroy(){
        Log.d(TAG,"onDestroy in ApplicatonOberver");
    }
}
  • 執行結果

APP剛啟動時會依次執行以下三種方法
onCreate in ApplicatonOberver
onStart in ApplicatonOberver
onResume in ApplicatonOberver

APP切換到後臺時會執行以下兩種方法
onPause in ApplicatonOberver
onStop in ApplicatonOberver

APP再次切換到前臺時會執行以下兩種方法
onStart in ApplicatonOberver

onResume in ApplicatonOberver

APP退出
onPause in ApplicatonOberver

onStop in ApplicatonOberver

  • 過ProcessLifecycleOwner我們可以輕易地檢測到APP合適從前臺進入到後臺,又是何時從後臺進入前臺,進而可以進行一些業務操作,並且不會增加耦合度
  • ProcessLifecycleOwner是針對整個應用程式的監聽,與Activity無關。
  • Lifecycle.Event.ON_CREATE只會呼叫一次,Lifecycle.Event.ON_DESTROY永遠不會被呼叫。
  • Lifecycle.Event.ON_START 和 Lifecycle.Event.ON_RESUME是一組,會依次呼叫,Lifecycle.Event.ON_START在Lifecycle.Event.ON_RESUME之前呼叫。
  • Lifecycle.Event.ON_PAUSE 和 Lifecycle.Event.ON_STOP是一組,會依次呼叫,而且Lifecycle.Event.ON_PAUSE在Lifecycle.Event.ON_STOP之前呼叫。