




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
【移動應(yīng)用開發(fā)技術(shù)】Android中Lifecycle的作用是什么
Android中Lifecycle的作用是什么?相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。
Lifecycle的簡單介紹Lifecycle的介紹,我們還是拿Google的官方文檔作為參考吧。Lifecycle主要解決的是業(yè)務(wù)和Activity/Fragment生命周期相關(guān)的問題。例如:我們在onResume()/onStart()中請求定位,在onPause()/onStop()中停止定位。那么我們一般的做法:class
MyLocationListener
{
public
MyLocationListener(Context
context,
Callback
callback)
{
//
...
}
void
start()
{
//
connect
to
system
location
service
}
void
stop()
{
//
disconnect
from
system
location
service
}
}
class
MyActivity
extends
AppCompatActivity
{
private
MyLocationListener
myLocationListener;
@Override
public
void
onCreate(...)
{
myLocationListener
=
new
MyLocationListener(this,
(location)
->
{
//
update
UI
});
}
@Override
public
void
onStart()
{
super.onStart();
myLocationListener.start();
//
manage
other
components
that
need
to
respond
//
to
the
activity
lifecycle
}
@Override
public
void
onStop()
{
super.onStop();
myLocationListener.stop();
//
manage
other
components
that
need
to
respond
//
to
the
activity
lifecycle
}
}上面的代碼雖然看起來還可以,但在真實的應(yīng)用程序中,可能會有很多的方法都需要根據(jù)當(dāng)前Activity/Fragment的生命周期來進行不同的操作。因此其生命周期方法中可能會被放置大量代碼,例如onStart()和onStop()中,這使得它們難以維護。因此Lifecycle應(yīng)運而生!3.Lifecycle的使用Lifecycle已經(jīng)發(fā)布了release版,所以其中的一些默認支持已經(jīng)包含到了support-v7:26.1.0以及更高。添加依賴:implementation
"android.arch.lifecycle:extensions:1.1.1"
annotationProcessor
"android.arch.lifecycle:compiler:1.1.1"使用方式1:實現(xiàn)LifecycleObserver接口,使用@OnLifecycleEvent注解,通過編譯時注解生成代碼:public
class
MyLifecycleObserver
implements
LifecycleObserver
{
private
static
final
String
TAG
=
MyLifecycleObserver.class.getSimpleName();
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
public
void
start(LifecycleOwner
lifecycleOwner)
{
Lifecycle.State
currentState
=
lifecycleOwner.getLifecycle().getCurrentState();
Log.d(TAG,
"start:
"
+
currentState);
}
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
public
void
stop(LifecycleOwner
lifecycleOwner)
{
Log.d(TAG,
"stop:
"
+
lifecycleOwner.getLifecycle().getCurrentState());
}
}
APT生成的代碼
使用方式2:實現(xiàn)GenericLifecycleObserver接口,實現(xiàn)其onStateChanged方法:public
class
MyLifecycleObserver
implements
GenericLifecycleObserver
{
private
static
final
String
TAG
=
MyLifecycleObserver.class.getSimpleName();
@Override
public
void
onStateChanged(LifecycleOwner
source,
Lifecycle.Event
event)
{
Log.d(TAG,
());
}
}創(chuàng)建完成后,我們需要將其添加:public
class
MainActivity
extends
AppCompatActivity
{
@Override
protected
void
onCreate(Bundle
savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getLifecycle().addObserver(new
MyLifecycleObserver());
}
}結(jié)果圖:方法1方法24.源碼分析1.Lifecycle的獲取根據(jù)源碼追蹤我們可以看到Lifecycle是在SupportActivity中:private
LifecycleRegistry
mLifecycleRegistry
=
new
LifecycleRegistry(this);
@Override
public
Lifecycle
getLifecycle()
{
return
mLifecycleRegistry;
}這里還有個挺重要的代碼:SupportActivity.javaprotected
void
onCreate(@Nullable
Bundle
savedInstanceState)
{
super.onCreate(savedInstanceState);
ReportFragment.injectIfNeededIn(this);
}ReportFragment.javapublic
static
void
injectIfNeededIn(Activity
activity)
{
android.app.FragmentManager
manager
=
activity.getFragmentManager();
if
(manager.findFragmentByTag(REPORT_FRAGMENT_TAG)
==
null)
{
manager.beginTransaction().add(new
ReportFragment(),
REPORT_FRAGMENT_TAG).commit();
manager.executePendingTransactions();
}
}這里在Activity中添加了一個Fragment,至于作用,留到后面在講。2.addObserveraddObserver方法的話,還是簡單來看吧:LifecycleRegistry.java@Override
public
void
addObserver(@NonNull
LifecycleObserver
observer)
{
State
initialState
=
mState
==
DESTROYED
?
DESTROYED
:
INITIALIZED;
ObserverWithState
statefulObserver
=
new
ObserverWithState(observer,
initialState);
ObserverWithState
previous
=
mObserverMap.putIfAbsent(observer,
statefulObserver);
//
對狀態(tài)的修正,這里會對已經(jīng)過去的狀態(tài)進行分發(fā)。也就是說如果添加observer時狀態(tài)已經(jīng)改變,那么也會被通知到!
}
//
有狀態(tài)的Observer
static
class
ObserverWithState
{
State
mState;
GenericLifecycleObserver
mLifecycleObserver;
ObserverWithState(LifecycleObserver
observer,
State
initialState)
{
mLifecycleObserver
=
Lifecycling.getCallback(observer);
mState
=
initialState;
}
void
dispatchEvent(LifecycleOwner
owner,
Event
event)
{
State
newState
=
getStateAfter(event);
mState
=
min(mState,
newState);
mLifecycleObserver.onStateChanged(owner,
event);
mState
=
newState;
}
}我們將實現(xiàn)的接口通過裝飾者(我認為是這樣)模式轉(zhuǎn)成ObserverWithState對象,并將該對象添加到mObserverMap中。
在ObserverWithState的構(gòu)造方法中,有對我們傳入的LifecycleObserver進行包裝:Lifecycling.java@NonNull
static
GenericLifecycleObserver
getCallback(Object
object)
{
//
這里應(yīng)該算第三種實現(xiàn)方式,然而FullLifecycleObserver不是public,所以不能使用
if
(object
instanceof
FullLifecycleObserver)
{
return
new
FullLifecycleObserverAdapter((FullLifecycleObserver)
object);
}
//
我們的第一種方式
if
(object
instanceof
GenericLifecycleObserver)
{
return
(GenericLifecycleObserver)
object;
}
//
通過注解生成的
final
Class<?>
klass
=
object.getClass();
//
將生成的MyLifecycleObserver_LifecycleAdapter放到Map中
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);
}根據(jù)我們傳入的對象進行解析,最終返回結(jié)果為:GenericLifecycleObserver或者GenericLifecycleObserver的實現(xiàn)類。附獲取生成MyLifecycleObserver_LifecycleAdapter代碼://
通過名稱獲取
public
static
String
getAdapterName(String
className)
{
return
className.replace(".",
"_")
+
"_LifecycleAdapter";
}最終通過Class.forName方式獲得Class。3.事件分發(fā)Lifecycle的事件分發(fā)在ObserverWithState類中://
事件分發(fā)
void
dispatchEvent(LifecycleOwner
owner,
Event
event)
{
State
newState
=
getStateAfter(event);
mState
=
min(mState,
newState);
mLifecycleObserver.onStateChanged(owner,
event);
mState
=
newState;
}看下哪里調(diào)用了dispatchEvent方法:
調(diào)用
我們看這個方法,其中一個在addObserver中調(diào)用,另外的兩個都會通過sync()方法調(diào)用://
happens
only
on
the
top
of
stack
(never
in
reentrance),
//
so
it
doesn't
have
to
take
in
account
parents
private
void
sync()
{
LifecycleOwner
lifecycleOwner
=
mLifecycleOwner.get();
if
(lifecycleOwner
==
null)
{
Log.w(LOG_TAG,
"LifecycleOwner
is
garbage
collected,
you
shouldn't
try
dispatch
"
+
"new
events
from
it.");
return;
}
//
最新的狀態(tài)和當(dāng)前狀態(tài)不一致,則需要進行狀態(tài)修改
while
(!isSynced())
{
mNewEventOccurred
=
false;
//
no
need
to
check
eldest
for
nullability,
because
isSynced
does
it
for
us.
if
(mSpareTo(mObserverMap.eldest().getValue().mState)
<
0)
{
backwardPass(lifecycleOwner);
}
Entry<LifecycleObserver,
ObserverWithState>
newest
=
mObserverMap.newest();
if
(!mNewEventOccurred
&&
newest
!=
null
&&
mSpareTo(newest.getValue().mState)
>
0)
{
forwardPass(lifecycleOwner);
}
}
mNewEventOccurred
=
false;
}
//
是否狀態(tài)同步的
private
boolean
isSynced()
{
if
(mObserverMap.size()
==
0)
{
return
true;
}
//
最新的和最后添加的Observer狀態(tài)一致,并且當(dāng)前的狀態(tài)和最新狀態(tài)一致,則已經(jīng)同步了
State
eldestObserverState
=
mObserverMap.eldest().getValue().mState;
State
newestObserverState
=
mObserverMap.newest().getValue().mState;
return
eldestObserverState
==
newestObserverState
&&
mState
==
newestObserverState;
}這里的同步方法用于同步當(dāng)前Observer的狀態(tài),如果最新的和最老的Observer的狀態(tài)不一致或者當(dāng)前的狀態(tài)和最新的狀態(tài)不一致時,那么需要進行狀態(tài)同步。同步包括了向前同步和向后同步。調(diào)用sync()方法一共就兩處,一處在addObserver方法,另一處是moveToState方法,而調(diào)用moveToState方法也有兩處:@SuppressWarnings("WeakerAccess")
@MainThread
public
void
markState(@NonNull
State
state)
{
moveToState(state);
}
public
void
handleLifecycleEvent(@NonNull
Lifecycle.Event
event)
{
State
next
=
getStateAfter(event);
moveToState(next);
}handleLifecycleEvent方法有很多處調(diào)用:handleLifecycleEvent調(diào)用
看圖的話,就可以知道Fragment在不同的生命周期調(diào)用了handleLifecycleEvent方法,隨便看一個吧:
ON_CREATE還記得上面說的ReportFragment嗎?這里也出現(xiàn)了,我們看下ReportFragment到底做什么的://
調(diào)用Activity的
private
voi
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025慶鈴集團校園招聘筆試參考題庫附帶答案詳解
- 廣東省廉江市實驗學(xué)校高中政治6.1人的認識從何而來教案必修4
- 四年級數(shù)學(xué)下冊二可能性9認識可能性同步練習(xí)浙教版
- 山西專版2024年中考數(shù)學(xué)復(fù)習(xí)第二單元方程組與不等式組課時訓(xùn)練06分式方程及其應(yīng)用
- 高中語文情感美文今生愿為了你……
- 質(zhì)量控制培訓(xùn)提升員工質(zhì)量意識
- 跨平臺營銷自動化的挑戰(zhàn)與機遇
- 部編四年級下冊《道德與法治》全冊教案-教學(xué)設(shè)計
- 湖南2025年01月長沙市望城區(qū)公開引進博士筆試歷年典型考題(歷年真題考點)解題思路附帶答案詳解
- 2025年紹興市柯橋區(qū)利民公路養(yǎng)護有限公司招聘筆試考點考試題庫答案
- 2025年廣西職業(yè)院校技能大賽高職組(商務(wù)數(shù)據(jù)分析賽項)參考試題庫資料及答案
- 2025年黑龍江農(nóng)墾職業(yè)學(xué)院單招職業(yè)傾向性測試題庫帶答案
- 四年級下冊 道德與法治 全冊教案
- 個人租房房屋合同范本
- MSA測量系統(tǒng)培訓(xùn)
- 冷庫安全培訓(xùn)
- 線上教育平臺教師教學(xué)行為規(guī)范與責(zé)任書
- 2025年內(nèi)蒙古法院系統(tǒng)招聘用制書記員2988人過渡高頻重點模擬試卷提升(共500題附帶答案詳解)
- 中央2025年全國婦聯(lián)所屬在京事業(yè)單位招聘93人筆試歷年參考題庫附帶答案詳解
- 《環(huán)境污染對生態(tài)系統(tǒng)的影響》課件
- 2024年保安員證資格考試題庫及答案
評論
0/150
提交評論