Andriod --- JetPack (二):LifeCycle 的诞生
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
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
通過注解的方式擁有 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支持
學習內容來自動腦學院~
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的Andriod --- JetPack (二):LifeCycle 的诞生的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Andriod --- JetPack
- 下一篇: Andriod --- JetPack