JetPack | Lifecycle 如何做到感知生命周期

LifeCycle的效果是什么:生命周期感知型组件可执行操作来呼应另一个组件(如 Activity 和 Fragment)的生命周期状况的改动。这些组件有助于您编写出更有条理且往往更精简的代码,此类代码更易于维护(摘自Android官网的解HTTP说)。
Lifecycle 最早是在 support 26.1.0 时被引入的,现在已经成为源码的gradle是什么一部分,而简直无需运用者在 Gradle 额gradle翻译外地配备依托。
L源码ifecycle的出现,能够协助咱们感知gradle教程生命周期。

关于LifeCycle的运用这儿不安全期计算器在复述直接httpwatch看官方文档,本篇文章旨在了解Lifecycle的实质以及优秀代码的规划思维。

Lifecycle出现的布景原因

在LifeCycle没有出现之前,假定外部类要先监听Activity/Fragment的生命安全中心周期,需求定义个接口来监听Activity的生命周期http 500方法(onCreate onSt安全教育渠道art onResume)等。防止内存泄漏等问题。
如下代码:随着Activity的功用越来越复杂,Listener处理的作业就会越appointment来越多,毕竟导致代码难以维护。

class MyLocationListener {
public MyLocationLhttp 500istener(Context context, Callback callback) {
//APP ...
}
void start() {
// connect to syste安全教育渠道m l安全教育ocation service
}
void stop() {
// disconnect from system location service
}
}
class MyActivity extends AppCompatActivity {
private MyLocationListener myLocationListener;
@Override
public void onCreate(...) {
myLocatihttpclientonListener = new MyLocationLishttp://www.baidu.comtener(this, (location) -> {
// updahttpclientte UI
});
}
@Override
public void onStart() {
super.onStart();
myLocationListhttpwatchener.start();
// manageapprove other components that nee源码年代d 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
}
}

那么Lifecycle是怎样结束组件的阻隔呢?

Lifecycle 结束阻隔

在Android的官方文档中看到有两个要害的接安全教育渠道LifecycleOwner 表明该类具有LifecycleLifecycleObserver** 监听生命周期作业** 以及 [Lihttp 500fecycleRegistry](https://developer.android.com/reference/androidx/lifecycle/LapplicationifecycleRegistry?hl=zh-cn)gradle装置装备 **将生命周期作业转发 **
下面咱们来自定义LifecycleOwner来结束Lifecycle的完好流转。
JetPack | Lifecycle 怎么做到感知生命周期

open class LActhttpclientivity:Activity(),Lihttp 500fecycleOwner {
/**
* 担任转产生命周期作业
*/
private var mFragmentLifecycleRegistry = LifecycleRegistry(this)
override fun onCrea安全期计算器te(savedInhttp 404stanceState: Bundlehttp://www.baidu.com?)https和http的差异 {
shttp://www.baidu.comuper.onCreate(savedInstanceState)
mFragmentLifecycleRegistry.ha安全期计算器ndleLifecycleEvent(Lifecycgradle菜鸟教程le.Event.ON_CREATE)
}
override fun ogradle和maven的差异nStart()appointment {
superhttp 500.onStart()
mFragmentLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START)
}
override fun onResume() {
super.o安全教育渠道nResume()
mFragmentLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_RESUME)
}
override fun onStop() {
super.onStop()
mFragmentLifecycleRegistry.handleLifecycleEvent(Lifecycle.Evehttpclientnt.ON_STOP)
}
ovhttp://www.baidu.comerride fun onDestroy() {
super.onDestroy()
mFragmentLifecycleRegistry.handleLifecycleEvengradle教程t(Lifecycle.Event.ON_DESTROY)
}
override fun getLifecycle(): Lifecycle {
return mFragmentLifecycleRegi源码网站stry
}
}appstore

LifecycleEventOb源码编辑器server监听生命周期:

class LifecycleActiv源码年代ity : LActivity()http://www.baidu.com {
override fun onCreate(shttp协议avedInstgradleanceState: Bundle?) {
super.onCreate(savedInstanceState)
setCo安全期计算器ntentView(R安全期是哪几天.layout.activity_lifecycle)
/安全/感知生命周期
lifecyclegradle和maven的差异.addObserver(MyLifecycleObserver())
}
}
/**
* 监听生命周期
*/
class MyLifgradle菜鸟教程ecycleObserver:LifecycleEventObserver{
override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {
Log.e("MyLifecycleObserver", "o安全模式怎么免除nStateChanged: ${source.lifec源码交易网站源码ycle.currentState} event:${event}" )
}
}

作业成果如下:Lifecycgradle下载le的作业以及状况的对应联络
JetPack | Lifecycle 怎么做到感知生命周期
在Android的官方文档 给出的作业和状况的联络,如下approve图和咱们上述的是共同的。
作业是监听生命周期的而状况是判别页面是否处于激活状况。

ON_CREATE 和 ON_STOP 对应着CREAT安全教育渠道登录入口ED。ON_START和ON_PAUSE对应着STARTED。这样的状况对应是因为ON_PAUShttps和http的差异E有重走onStart的潜力,而ON_STOP有重走onCreate的潜力

JetPack | Lifecycle 怎么做到感知生命周期

那么Lifecycle为什么要安全规划作业和状况呢?

L安全ifecycle作业和状况的对应联络

  • event:结束了 LifecycleObserver 的第三方组件,能够在 ogradle打包nCreateonDestroy 等 event 方法内结束对生命周期的监听,event 是针对 第三方组件内部作为查询者,来查询 页面对组件的推送。
  • state :的存在,主要是 为了方便运用者判别 页面是否处于激活状况,安全教育以便结束生命周期安全的告诉(在之前的一篇文章LiveData 怎样安全查询数据,讲解了LiveData的中心代码和Lifecycle有关),state 是针对 页面作为安全教育渠道查询者安全,来查询 来自第三方组件内部对页面的推送,那么此时经过 s安全tate 的判别,咱们可保证APP在页面处源码于非激活状况时不收到 根http代理据 LifeCycle 的组件(比如gradle菜鸟教程 LiveData)的推送。

LiveData是依据State来判别生命周期是否处于生动状况的,如下代码:

lifecycleOwner.lifecycle.currentState.isAtLeast(Lifecycle.State.STARTED)

只需 onResume 和 onPause 是介于 STARTED、RESUMED 状况之间,也即 只需这两个生命周期节点 100% 确定能收到 LiveData 的推送(FragmentActivity 额定支撑 onStart 期间的接收)。(在重学安卓专栏中有介绍过状况的效果)

LifecycleRegistry 中心类gradle打包

LappstoreifecycleRegistry 的规划怎样去分发作业。其实看源码网站到源码能够和LiveData的分发音讯差不多app下载

JetPack | Lifecycle 怎么做到感知生命周期
如下代码:经过handleLifecycleEvent发送生命周期作业

   // 分产生https和http的差异命周期作业 
public void hahttp://www.baidu.comndleLifecycleEve源码nt(@NonNull Lifecycle.Event event) {
enforceMainThreadIfNeeded("handl源码交易网站源码eLifecycleEvent")gradle下载;
moveToState(event.getTargetState());
}
private void moveToState(State next) {
......
sync();安全教育
......
}
private void sync() {
Lifecy源码网站cleOwner lifecycleOwner = mLifecycleOwner.get();
....
whilegradle和maven的差异 (!isSynced()) {
mNewEventOccurred = false;
if (mStatHTTPe.http://www.baidu.comcompareTgradle装置装备o(mObserverMap.eldest().getValue().mState) < 0) {
backwardPass(lifecycleOwner);
}
Map.Entry<LifecycleObserver, ObserverWithState> newest =
mObserverMap.newest()源码之家;
if (!mNewEventOccurred && newest != null
&& mStathttp 302e.compareTo(newest.getValue().mState) > 0) {
forwardPass(lifecycleOwn源码精灵er);
}
}
mNewEventOccurred = fals安全手抄报e;
}

sync()方法别离调用了forwardPassbackwardPass进行分产生命周期作业http://192.168.1.1登录
监听生命周期作业及状况:
mObserverMap 存储监听ObserverWithStatAPPe

    private FastSafegradle插件IterableMap<LifecycleObserver, ObserverWithState> mObserverMap =http 500
new FastSafeIterableMap<>(http 302);

addObserver 增加监听作业,将obsever包装成ObserverWithState(这一段代码和LiveData中的observer相似源码本钱)

    @Override
public void addObserver(@NonNullhttps和http的差异 LifecycleObserver observer) {
enforceMainThreadIfNgradle插件eeded("addObserver");
State initialState = mState == DESTROYED ? DESTROYED : INITIALIZED;
//observer 包装ObserverWithState
ObserverWith源码是什么意思State statefulObserver = new ObserverWithSt安全手抄报ate(observer, initialState);
//mObserverMap 存储statefulObserver
ObserverWithState previous = mObserverMap.putIfAbsgradle教程ent(observer,安全期是哪几天 statefhttp 302ulObservapproacher);
//.......
boolean isR源码本钱eentrance = mAddingObserverCounter != 0 || mHandlingEvent;
State targetState = calculateTargetStahttpwatchte(observer);
mAddingObservhttpclienterCounter++;
//重复addObse源码年代训练怎么样rver 会回来之前的状况
while ((state安全期是哪几天fulObserver.mState.compareTo(targetState) < 0
&& mgradle菜鸟教程ObserverMap.containsgradle和maven的差异(observer))) {
pushParentState(statefulObserver.mState);
final Event源码网站 event = Event.upFappearancerom(statefulhttp 500Observer.mState);
if (event == null) {
throw new Il安全手抄报legalStateException("no event up from " + statefulObserver.mState);
}
//appstore发送生命周期作业
statefulObserver.gradle和maven的差异dispatchEvent(lifecycleOwner, event)HTTP;
popParentState();
/appstore/ mState / subling may have been changed recalculate
targetState = calculateTargetSappearancetate(observer);
}
if (!isReentrance) {
//gradle教程 we do sync only on the top level.
sync();
}
mAddingObserverCounter--;
}

ObserverWithStateappreciate包装类经过dispatchEvent,在经过mLifecycleObservgradle装备er.onStateCh源码编辑器anged分发作业

    static class ObserverWithState {
State mState;
LifecycleEventObserver mLifecycleObserver;
ObserverWithState(LifecycleObserver observer, State initialState) {
mLifecycleObserver = Lifecycling.lifecycleEventObserver(observer);
mState = initialState;
}
void dispatchEvent(Lifecgradle下载ycleOwner owner, Event event) {
//获取该作业对应的状况
State newState源码是什么意思 = event.getTargetState();
//判别其时的情源码精灵
mState = min(mState, newState);
//发送作业及状况
mLifecycleObserver.onStateChttp 302hanged(owner, event);
mState = newState;
}
}

http 500

发表评论

提供最优质的资源集合

立即查看 了解详情