日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Andriod --- JetPack (二):LifeCycle 的诞生

發(fā)布時間:2025/3/21 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Andriod --- JetPack (二):LifeCycle 的诞生 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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 增刪改查實例

一、使用的原因

解耦系統(tǒng)組件與普通組件

二、代碼實例:LifeCycle解耦A(yù)ctivity與組件

比如一個普通控件 Chronometer 的使用與 Activity 的生命周期關(guān)聯(lián)的太強,即普通控件 Chronometer 的業(yè)務(wù)邏輯必須在 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);}// 活躍狀態(tài)@Overrideprotected void onResume() {super.onResume();chronometer.setBase(SystemClock.elapsedRealtime() - elapseTime); // 返回啟動后的毫秒數(shù),包括睡眠時間。chronometer.start();}// 轉(zhuǎn)到后臺@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 的生命周期關(guān)聯(lián)的太強
我們來看一下修改之后的代碼:

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 實現(xiàn) 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); // 返回啟動后的毫秒數(shù),包括睡眠時間。start();}@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)public void stopMeter() {elapseTime = SystemClock.elapsedRealtime() - getBase();stop();} }

通過注解的方式擁有 Activity 生命周期所擁有的方法,這樣就在很大的程度上解耦了

三、代碼實例:LifeCycleService解耦Service與組件

代碼測試的時候記得開啟GPS權(quán)限

添加依賴:

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.幫助開發(fā)者建立可感知生命周期的組件
2.組件在其內(nèi)部管理自己的生命周期,從而降低模塊耦合度
3.降低內(nèi)存泄漏發(fā)生的可能性
4.Activity、Fragment、Service、Application均有LifeCycle支持

學(xué)習(xí)內(nèi)容來自動腦學(xué)院~

《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結(jié)

以上是生活随笔為你收集整理的Andriod --- JetPack (二):LifeCycle 的诞生的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。