Android Jetpack 組件是庫的集合,這些庫是爲了協同工做而構建的,不過也能夠單獨採用,接下來會一一詳細地學習這些庫, 下面源碼版本是com.android.support:appcompat-v7:28.0.0, 以及庫android.arch.lifecycle:extensions:1.1.1java
這個庫從系統框架層去管理具備生命週期的組件,例如activity, fragment。讓開發更方便地去管理本身應用裏須要和activity或者fragment綁定的組件,讓代碼更容易維護。android
也許有點抽象,舉個例子說明一下,好比有個需求,須要在一個界面比較頻繁更新地理位置信息。當Activity走了onstop以後,你應該也要暫停更新地理位置,或者當Activity走destroy後,你要釋放一些資源。下面用一些代碼實例解析一下,你的代碼也許是這樣的:bash
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周期函數
}
}
複製代碼
上面的代碼在簡單app看起來也許還好,可是當你activity業務邏輯比較多,可能包含不少和生命週期綁定的自定義組件,代碼長期積累就很難維護啦。app
下面在看看使用Lifecycles庫的代碼作對比:框架
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註解就能夠收到相應的回調,在Activity的onCreate方法裏調用 getLifecycle().addObserver(myLocationListener)便可。下面結合源碼分析Lifecycles庫, 去更好地學習這個庫。ide
Support Library 26.1.0 版本以及以後的版本,AppCompatActivity和Fragment實現了LifecycleOwner。類圖以下所示:函數
Lifecycles庫核心就是訂閱者模式。源碼分析
LifecycleOberver類:只是個空接口, 安卓生命週期觀察者,post
Lifecycle類: 是個抽象類,定義了安卓生命週期對象,有3個方法,添加觀察者,移除觀察者,獲取當前狀態。性能
LifecycleOwner類: 是個接口, 安卓生命週期的擁有者
LifecycleRegistry: Lifecycle的實現類,實現了添加、移除觀察者,分派觀察者狀態等
自定義類實現LifecycleOberver接口,在方法中添加OnLifecycleEvent註解就能夠收到相應生命週期的狀態
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幾種狀態
複製代碼
Lifecycle的各個狀態以及事件分發過程以下圖所示: (該圖來自google官網文檔)
箭頭上面表明分發的Event:
你會發現State沒STOPED和PAUSED的狀態, 當State=CREATED時, Activity大概是在onCreate調用後或者onStop調用後;當State=STARTED時, Activity大概是在onStart調用後或者onPause調用後
下面截取部分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的是Event分發是經過添加一個ReportFragment, 經過重寫ReportFragment的onActivityCreated, onStart, onResume, onStop, onPause, onDestroy方法,最終交給LifecycleRegistry.handleLifecycleEvent(event)處理。
下面也是截去相關v4裏Fragment的相關源碼
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(event)處理。 至於LifecycleRegistry這個類更多的細節就不展開啦
前面提到Support Library 26.1.0 版本以及以後的版本,AppCompatActivity和Fragment實現了LifecycleOwner, 若是你還用舊的版本或者繼承Activity, 你能夠經過自定義Activity或者Fragment實現。自定義實現代碼以下:
//能夠單獨引入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;
}
}
複製代碼
要注意ON_CREATE的Event以後分發一次,ON_DESTROY不會分發
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毫秒的延遲, 官方的解析是保證不要因爲配置更改而銷燬和從新Activity時不會分發任何事件。還有一點,若是你的app是多進程應用,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 繼承Service, 並實現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: ");
}
});
}
}
複製代碼
Lifecycles庫爲Jetpack其餘組件打下了基礎,經過LifecycleObserver觀察者減小對Activity, Fragment, 和Service這些具備生命週期類的依賴。