简介:
生命周期感应组件简单来说
例如:a 启动了b 进行一个耗时操作 当a销毁时 我们应该结束b中的耗时操作 销毁b对象 换句话说 也就是b应该对a的生命周期状态做出正确的相应 生命周期感应组件 就是来使我们这种操作变得更加方便 准确 简洁的一种方式
classMyLocationListener{ publicMyLocationListener(Context context,Callback callback){ // ... } void start(){ // connect to system location service } void stop(){ // disconnect from system location service } } classMyActivityextendsAppCompatActivity{ privateMyLocationListener myLocationListener; @Override publicvoid onCreate(...){ myLocationListener =newMyLocationListener(this,(location)->{ // update UI }); } @Override publicvoid onStart(){ super.onStart(); myLocationListener.start(); // manage other components that need to respond // to the activity lifecycle } @Override publicvoid onStop(){ super.onStop(); myLocationListener.stop(); // manage other components that need to respond // to the activity lifecycle } }
这段定位代码 看起来 不错 通过监听完成了定位操作对activity周期相应 但是 一般我们会在activity的生命周期(例如onStart)中进行大量其他组件的初始化
那么如果再start执行之前 onstop执行了那么问题就严重了 此时 组件存活时间 超过了正常需要的时间 一般情况下 我们会选择如下的修改方式
class MyActivity extends AppCompatActivity{ private MyLocationListener myLocationListener; publicvoid onCreate(...){ myLocationListener =newMyLocationListener(this, location ->{ // update UI }); } @Override publicvoid onStart(){ super.onStart(); Util.checkUserStatus(result->{ // what if this callback is invoked AFTER activity is stopped? if(result){ myLocationListener.start(); } }); } @Override publicvoid onStop(){ super.onStop(); myLocationListener.stop(); } }
这样看起来 代码会很复杂 此时 liferecycle-aware 能够很好的帮助我们完成这种事情
lifecycle是一个class 它包括了 组件的生命周期(比如 activity 、fragment) 并且 允许其他组件来观察生命周期活动 (简单来说就像给组件设置观察者)
如图所示 图上的节点 就是组件状态 将事件视为节点之间的边 我们通过在被观察类上面添加注解的形式 来监视其状态 其他类可以通过addObserver()方法
实现状态监听
如下
再project 的build.gradle 添加 google()引用
repositories {
google()
jcenter()
在app 的 build.gradle 下添加 插件
// ViewModel and LiveData
implementation "android.arch.lifecycle:extensions:1.1.1"
// alternatively, just ViewModel
implementation "android.arch.lifecycle:viewmodel:1.1.1"
// alternatively, just LiveData
implementation "android.arch.lifecycle:livedata:1.1.1"
创建 状态观察者(lifecycleObserver) myObserver
public class MyObserver implements LifecycleObserver {
private static final String TAG = "lifeCycle";
/**
* 当组件可见时执行
*/
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
public void onConnectionListener() {
Log.d(TAG,"onConnectionListener");
}
/**
* 当组件不可见的时候 执行
*/
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
public void onDisConnectionListener() {
Log.d(TAG,"onDisConnectionListener");
}
}
}
创建被观察者(状态持有者 lifecycleowner)
ps:v4包的Fragment与FragmentActivity类实现了LifecycleOwner接口,通过接口里面的getLifecycle()方法获取Lifecycle对象。 我们可以在自己类里面实现LifecycleOwner接口。
那么我们先使用activity 默认 实现
public class MainActivity extends AppCompatActivity {
private static final String TAG = "lifeCycle"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); MyObserver myObserver = new MyObserver(); // 注册内容观察者 getLifecycle().addObserver(myObserver); } @Override protected void onStart() { super.onStart(); Log.d(TAG,"onStart"); } @Override protected void onResume() { super.onResume(); Log.d(TAG,"onResume"); } @Override protected void onPause() { super.onPause(); Log.d(TAG,"onPause"); } @Override protected void onStop() { super.onStop(); Log.d(TAG,"onStop"); }}
运行结果 : 自己测试被呗
03-28 20:33:11.899 28311-28311/com.example.lifeapplication D/lifeCycle: onStart
03-28 20:33:11.903 28311-28311/com.example.lifeapplication D/lifeCycle: onResume
03-28 20:33:11.903 28311-28311/com.example.lifeapplication D/lifeCycle: onConnectionListener
03-28 20:33:12.066 28311-28311/com.example.lifeapplication D/lifeCycle: onDisConnectionListener
03-28 20:33:12.066 28311-28311/com.example.lifeapplication D/lifeCycle: onPause
03-28 20:33:12.107 28311-28311/com.example.lifeapplication D/lifeCycle: onResume
03-28 20:33:12.107 28311-28311/com.example.lifeapplication D/lifeCycle: onConnectionListener
下面我们自己实现lifeCycleOwner
public class MainActivity extends AppCompatActivity implements LifecycleOwner { private static final String TAG = "lifeCycle"; /** * 创建life 注册表 */ private LifecycleRegistry mLifecycleRegistry; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 注册MyActivity为lifeCycle提供者 由此是不是可以扩展自己的工具类了 哈哈 这里我就不写了 mLifecycleRegistry = new LifecycleRegistry(this); mLifecycleRegistry.markState(Lifecycle.State.CREATED); mLifecycleRegistry.addObserver(new MyObserver()); } @Override protected void onStart() { super.onStart(); Log.d(TAG, "onStart"); mLifecycleRegistry.markState(Lifecycle.State.STARTED); } @Override protected void onResume() { super.onResume(); Log.d(TAG, "onResume"); mLifecycleRegistry.markState(Lifecycle.State.RESUMED); } @Override protected void onPause() { super.onPause(); Log.d(TAG, "onPause"); mLifecycleRegistry.markState(Lifecycle.State.DESTROYED); } @Override protected void onStop() { super.onStop(); Log.d(TAG, "onStop"); mLifecycleRegistry.markState(Lifecycle.State.DESTROYED); } @Override public Lifecycle getLifecycle() { return mLifecycleRegistry; }
遗留问题 : markState 的时候 我没有在State中找到ONPAUSE值 暂时先这么处理吧 有建议的小伙伴 可以帮帮我呢 ~
基本上生命周期管理到这里就结束了
还有下一章 呢 ~