1.Andriod — JetPack (一):初识 JetPack

2.Andriod — JetPack (二):LifeCycle 的诞生

3.Andriod — JetPack (三):ViewModel 的诞生

4.Andriod — JetPack (四):BaseObservable 与 ObservableField 双向绑定

5.Andriod — JetPack (五):DataBinding + LiveData +ViewModel 简单实例

6.Andriod — JetPack (六):Room 增删改查

7.Andriod — JetPack (七):Room + ViewModel + LiveData 增删改查实例

一、使用的原因

解耦系统组件与普通组件

二、代码实例:LifeCycle解耦Activity与组件

比如一个普通控件 Chronometer 的使用与 Activity 的生命周期关联的太强,即普通控件 Chronometer 的业务逻辑必须在 Activity 的生命周期中处理,这样的耦合度就太高,所以我们使用LifeCycle 来解决

我们先来看没有使用 LifeCycle 之前的代码:
MainActivity.java

package com.example.lifecycle;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;
import android.os.SystemClock;
import android.widget.Chronometer;public class MainActivity extends AppCompatActivity {private Chronometer chronometer;private Long elapseTime = 0l;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);chronometer = findViewById(R.id.chronometer);}// 活跃状态@Overrideprotected void onResume() {super.onResume();chronometer.setBase(SystemClock.elapsedRealtime() - elapseTime); // 返回启动后的毫秒数,包括睡眠时间。chronometer.start();}// 转到后台@Overrideprotected void onPause() {super.onPause();elapseTime = SystemClock.elapsedRealtime() - chronometer.getBase();chronometer.stop();}
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><com.example.lifecycle.MyChronometerandroid:id="@+id/chronometer"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Hello World!"android:textSize="36sp"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent" /></androidx.constraintlayout.widget.ConstraintLayout>

很明显,Chronometer 的使用与 Activity 的生命周期关联的太强
我们来看一下修改之后的代码:

MainActivity2 .java

package com.example.lifecycle;import android.os.Bundle;
import android.os.SystemClock;
import android.widget.Chronometer;import androidx.appcompat.app.AppCompatActivity;public class MainActivity2 extends AppCompatActivity {private MyChronometer chronometer;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);chronometer = findViewById(R.id.chronometer);getLifecycle().addObserver(chronometer);}
}

自定义 MyChronometer 类继承 Chronometer 实现 LifecycleObserver
MyChronometer .java

package com.example.lifecycle;import android.content.Context;
import android.os.SystemClock;
import android.util.AttributeSet;
import android.widget.Chronometer;import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleObserver;
import androidx.lifecycle.OnLifecycleEvent;public class MyChronometer extends Chronometer implements LifecycleObserver {private Long elapseTime = 0l;public MyChronometer(Context context, AttributeSet attrs) {super(context, attrs);}// 通过注解的方式拥有 Activity 生命周期所拥有的方法@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)public void startMeter() {setBase(SystemClock.elapsedRealtime() - elapseTime); // 返回启动后的毫秒数,包括睡眠时间。start();}@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)public void stopMeter() {elapseTime = SystemClock.elapsedRealtime() - getBase();stop();}
}

通过注解的方式拥有 Activity 生命周期所拥有的方法,这样就在很大的程度上解耦了

三、代码实例:LifeCycleService解耦Service与组件

代码测试的时候记得开启GPS权限

添加依赖:

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

AndroidMainfest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.lifecycle"><uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/AppTheme"><activity android:name=".MainActivity3"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><activity android:name=".MainActivity2"></activity><service android:name=".MyLocationService" /></application></manifest>

MainActivity3.java

package com.example.lifecycle;import androidx.appcompat.app.AppCompatActivity;import android.content.Intent;
import android.os.Bundle;
import android.view.View;public class MainActivity3 extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity3_main);}public void startGps(View view) {startService(new Intent(this, MyLocationService.class));}public void stopGps(View view) {stopService(new Intent(this, MyLocationService.class));}
}

activity3_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity3"><Buttonandroid:id="@+id/button"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="开始"android:onClick="startGps"android:textSize="36sp"app:layout_constraintBottom_toTopOf="@+id/button2"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent" /><Buttonandroid:id="@+id/button2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginBottom="240dp"android:text="停止"android:onClick="stopGps"android:textSize="36sp"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintHorizontal_bias="0.501"app:layout_constraintStart_toStartOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

MyLocationService.java

package com.example.lifecycle;import android.util.Log;import androidx.lifecycle.LifecycleService;public class MyLocationService extends LifecycleService {public MyLocationService() {Log.d("liang", "MyLocationService");MyLocationObserver myLocationObserver = new MyLocationObserver(this);getLifecycle().addObserver(myLocationObserver);}
}

MyLocationObserver.java

package com.example.lifecycle;import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.util.Log;import androidx.core.app.ActivityCompat;
import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleObserver;
import androidx.lifecycle.OnLifecycleEvent;public class MyLocationObserver implements LifecycleObserver {private Context context;private LocationManager locationManager;private MyLocationListener myLocationListener;public MyLocationObserver(Context context) {this.context = context;}@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)public void startGetLocation() {Log.d("liang", "startGetLocation");locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);myLocationListener = new MyLocationListener();if (ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {return;}locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 3000, 1, myLocationListener);}@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)public void stopGetLocation() {Log.d("liang", "stopGetLocation");locationManager.removeUpdates(myLocationListener);}static class MyLocationListener implements LocationListener {@Overridepublic void onLocationChanged(Location location) {Log.d("liang", "location changed" + location.toString());}@Overridepublic void onStatusChanged(String provider, int status, Bundle extras) {}@Overridepublic void onProviderEnabled(String provider) {}@Overridepublic void onProviderDisabled(String provider) {}}
}

可以在 Terminal 终端中通过一下命令改变位置信息

adb -s emulator-5554 emu geo fix 121.4961236714487 31.244010934431345

四、LifeCycle的好处

1.帮助开发者建立可感知生命周期的组件
2.组件在其内部管理自己的生命周期,从而降低模块耦合度
3.降低内存泄漏发生的可能性
4.Activity、Fragment、Service、Application均有LifeCycle支持

学习内容来自动脑学院~

Andriod --- JetPack (二):LifeCycle 的诞生相关推荐

  1. Andriod --- JetPack (三):ViewModel 的诞生

    1.Andriod - JetPack (一):初识 JetPack 2.Andriod - JetPack (二):LifeCycle 的诞生 3.Andriod - JetPack (三):Vie ...

  2. Andriod --- JetPack (七):Room + ViewModel + LiveData 增删改查实例

    1.Andriod - JetPack (一):初识 JetPack 2.Andriod - JetPack (二):LifeCycle 的诞生 3.Andriod - JetPack (三):Vie ...

  3. Andriod --- JetPack (六):Room 增删改查

    1.Andriod - JetPack (一):初识 JetPack 2.Andriod - JetPack (二):LifeCycle 的诞生 3.Andriod - JetPack (三):Vie ...

  4. Andriod --- JetPack (四):BaseObservable 与 ObservableField 双向绑定

    1.Andriod - JetPack (一):初识 JetPack 2.Andriod - JetPack (二):LifeCycle 的诞生 3.Andriod - JetPack (三):Vie ...

  5. Andriod --- JetPack (五):DataBinding + LiveData +ViewModel 简单实例

    1.Andriod - JetPack (一):初识 JetPack 2.Andriod - JetPack (二):LifeCycle 的诞生 3.Andriod - JetPack (三):Vie ...

  6. Andriod --- JetPack (一):初识 JetPack

    1. Andriod --- JetPack (一):初识 JetPack 2. Andriod --- JetPack (二):LifeCycle 的诞生 3. Andriod --- JetPac ...

  7. 硬核讲解 Jetpack 之 LifeCycle 使用篇

    大家好,我是 LifeCycle ,来自 Jetpack 生态链的最底端 . 我的作用是感知组件 (Activity/Fragment) 生命周期 ,并在合适的生命周期执行你分配给我的任务.我坚持贯彻 ...

  8. Jetpack 之 LifeCycle

    Jetpack 之 LifeCycle 文章目录 Jetpack 之 LifeCycle @[toc] 1. 使用意义 2. LifeCycle诞生的背景 3. LifeCycle可以做什么 4. 使 ...

  9. Android databingding与jetpack的lifecycle使用与比较

    1.开发环境Android studio 3.4.0,kotlin 2.databinding用法 3.jetpack lifecycles的LiveData 和 ViewModel用法 测试效果如下 ...

最新文章

  1. R语言可视化散点图(scatter plot)、并在散点图中叠加回归曲线、叠加lowess拟合曲线(linear and lowess fit lines)、使用plot、line、abline函数
  2. POJ3322滚箱子游戏(不错)
  3. kvm.huge页、常用命令和桥接设置
  4. python进度条 pyqt_python如何通过pyqt5实现进度条
  5. 吴恩达给 74 岁老父亲发证了!8 年完成 146 门课程!
  6. vue watch监听某输入框中是否有值,然后改变某输入框的属性值
  7. wpf 按钮样式_键盘 | 01.在程序集间引用样式
  8. java array 元素的位置_JAVA集合类,有这一篇就够了
  9. 使用NGINX Plus API动态配置upstream
  10. 利尔达NB-IOT模块对接移动onenet平台步骤
  11. 高8kB计算机组成原理,计算机组成原理习题及答案
  12. Spring基于注解管理bean(一文搞懂注解及使用注解)
  13. 让你了解一下世界名人blog
  14. NOIP2017提高成绩
  15. 心系冬奥 翰墨传情 |当代书画名家为奥运加油书画推介展【冉春艳篇】
  16. Jetson TX2刷机教程
  17. NetSpectre:通过网络读取任意内存
  18. 【C++】面向对象之继承篇
  19. CSS选择器大全包含nth-child和nth-of-type的区别
  20. O2O、C2C、B2B、B2C

热门文章

  1. linux下oracle安装
  2. 4月份不良与垃圾信息举报:垃圾邮件占37.4%
  3. Win Server 2008中开启Areo特效
  4. exe4j生成可执行程序的使用方法
  5. 全国公共英语五级(PETS-5) 写作作文
  6. Windows下如何安装和使用git
  7. 在Windows下使用webpack入门
  8. 区块链开源实现 hyperledger fabric 概念与原理
  9. 吴恩达深度学习课程deeplearning.ai课程作业:Class 4 Week 4 Face Recognition for the Happy House
  10. caffe学习(一):开发环境搭建,编译caffe(win10)