• Jetpack架构组件_LifeCycle组件


    1.LifeCycle组件 

            LifeCycle组件可以让我们自定义的类能主动感知到Activity、Fragment、Application、Service等系统组件的生命周期。

           我们以百度定位为例,我们一般在Activity生命周期的onCreate回调函数里调用自定义类LocationService的Start()方法,在onStop回调里调用LocationService的stop()方法来启动和停止定位服务。

            利用LifeCycle让LocationService作为观察者,能感知到Activity的生命周期,当activity执行到onCreate与onStop时,LocationService自动调用它内部的start()与stop()方法来启动与停止定位,而无需再在activity里写调用LocationService.start()与LocationService.stop的代码了。当然这里的被观察者自然就是activty了。

    2.使用LifeCycle解耦Activity与自定义组件 

    2.1关键步骤 

         step1.自定义类(自定义组件):

            (1)让自定义类(或者称作自定义组件)实现LifecycleObserver。 

            (2)在要执行的函数start()和stop()上面添加注解@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)与@OnLifecycleEvent(Lifecycle.Event.ON_STOP)。

    2.2示例代码: 

            自定义类LocationService.java

    1. package com.gaoting.lifecycleactivity;
    2. import android.util.Log;
    3. import androidx.lifecycle.Lifecycle;
    4. import androidx.lifecycle.LifecycleObserver;
    5. import androidx.lifecycle.OnLifecycleEvent;
    6. /**
    7. * 封装了定位的开启和停止
    8. */
    9. public class LocationService implements LifecycleObserver {
    10. String TAG = "LocationService";
    11. /**
    12. * 开始定位
    13. */
    14. @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    15. public void start() {
    16. Log.i(TAG, "开始定位");
    17. }
    18. /**
    19. * 停止定位
    20. */
    21. @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    22. public void stop() {
    23. Log.i(TAG, "停止定位");
    24. }
    25. }

            MainActivity.java

    1. package com.gaoting.lifecycleactivity;
    2. import android.os.Bundle;
    3. import androidx.activity.EdgeToEdge;
    4. import androidx.appcompat.app.AppCompatActivity;
    5. import androidx.core.graphics.Insets;
    6. import androidx.core.view.ViewCompat;
    7. import androidx.core.view.WindowInsetsCompat;
    8. public class MainActivity extends AppCompatActivity {
    9. LocationService mLocationService;
    10. @Override
    11. protected void onCreate(Bundle savedInstanceState) {
    12. super.onCreate(savedInstanceState);
    13. setContentView(R.layout.activity_main);
    14. mLocationService = new LocationService();
    15. getLifecycle().addObserver(mLocationService);
    16. }
    17. }

    3.使用LifeCycle解耦Service与自定义组件

    3.1关键步骤 

             添加依赖:

            implementation libs.lifecycle.extensions
    

            step1:Service处理

            (1)让Service继承于LifecycleService

            (2)getLifecycle().addObserve()将观察者与被观察者绑定,即将自定义类与Service绑定。

            step2:自定义类的处理

            (1)实现LifecycleObserver接口。

            (2)添加标签注解事件,感知Service的生命周期。

    3.2示例代码

    实现Service类MyService.java。

    1. package com.gaoting.lifecycleactivity;
    2. import android.app.Service;
    3. import android.content.Intent;
    4. import android.os.IBinder;
    5. import android.util.Log;
    6. import androidx.annotation.Nullable;
    7. import androidx.lifecycle.LifecycleService;
    8. public class MyService extends LifecycleService {
    9. String TAG = "MyService";
    10. LocationService mlocationService;
    11. public MyService() {
    12. mlocationService = new LocationService();
    13. getLifecycle().addObserver(mlocationService);
    14. }
    15. @Override
    16. public void onCreate() {
    17. Log.i(TAG, "onCreate");
    18. super.onCreate();
    19. }
    20. @Override
    21. public int onStartCommand(@Nullable Intent intent, int flags, int startId) {
    22. Log.i(TAG, "onStartCommand");
    23. return super.onStartCommand(intent, flags, startId);
    24. }
    25. @Override
    26. public void onDestroy() {
    27. Log.i(TAG, "onDestroy");
    28. super.onDestroy();
    29. }
    30. }

    自定义类LocationService.java。

    1. package com.gaoting.lifecycleactivity;
    2. import android.util.Log;
    3. import androidx.lifecycle.Lifecycle;
    4. import androidx.lifecycle.LifecycleObserver;
    5. import androidx.lifecycle.OnLifecycleEvent;
    6. /**
    7. * 封装了定位的开启和停止
    8. */
    9. public class LocationService implements LifecycleObserver {
    10. String TAG = "LocationService";
    11. /**
    12. * 开始定位
    13. */
    14. @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    15. public void start() {
    16. Log.i(TAG, "ON_CREATE开始定位");
    17. }
    18. /**
    19. * 停止定位
    20. */
    21. @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    22. public void stop() {
    23. Log.i(TAG, "ON_STOP停止定位");
    24. }
    25. /**
    26. * 停止定位:用于感知Service的onDestroy生命周期
    27. */
    28. @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    29. public void stopLoc() {
    30. Log.i(TAG, "ON_DESTROY停止定位");
    31. }
    32. }

    MainActivity类。

    1. package com.gaoting.lifecycleactivity;
    2. import android.content.Intent;
    3. import android.os.Bundle;
    4. import android.util.Log;
    5. import android.view.View;
    6. import androidx.activity.EdgeToEdge;
    7. import androidx.appcompat.app.AppCompatActivity;
    8. import androidx.core.graphics.Insets;
    9. import androidx.core.view.ViewCompat;
    10. import androidx.core.view.WindowInsetsCompat;
    11. import androidx.databinding.DataBindingUtil;
    12. import com.gaoting.lifecycleactivity.databinding.ActivityMainBinding;
    13. public class MainActivity extends AppCompatActivity {
    14. String TAG = "MainActivity";
    15. ActivityMainBinding activityMainBinding;
    16. LocationService mLocationService;
    17. @Override
    18. protected void onCreate(Bundle savedInstanceState) {
    19. super.onCreate(savedInstanceState);
    20. activityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
    21. mLocationService = new LocationService();
    22. getLifecycle().addObserver(mLocationService);
    23. /**
    24. * 启动服务
    25. */
    26. activityMainBinding.btStartService.setOnClickListener(new View.OnClickListener() {
    27. @Override
    28. public void onClick(View v) {
    29. Intent i = new Intent(MainActivity.this, MyService.class);
    30. startService(i);
    31. }
    32. });
    33. /**
    34. * 停止服务
    35. */
    36. activityMainBinding.btStopService.setOnClickListener(new View.OnClickListener() {
    37. @Override
    38. public void onClick(View v) {
    39. Intent i = new Intent(MainActivity.this, MyService.class);
    40. stopService(i);
    41. }
    42. });
    43. }
    44. @Override
    45. protected void onStop() {
    46. Log.i(TAG, "onStop");
    47. super.onStop();
    48. }
    49. @Override
    50. protected void onDestroy() {
    51. Log.i(TAG, "onDestroy");
    52. super.onDestroy();
    53. }
    54. }

    4.使用ProcessLifecycleOwner感知Application。

    4.1关键步骤

            添加依赖:implementation libs.lifecycle.extensions。

            step1:MyApplication处理。

            (1)继承Application。

            (2)ProcessLifecycleOwner.getLifecycle().addObserver() 将观察者与被观察者绑定,即将自定义类与MyApplication绑定。

            step2.自定义类的处理

            (1)实现LIfecycleObserver接口。

            (2)添加标签注解事件,感知Application的生命周期。

    4.2示例代码

            MyApplication.java。

    1. package com.gaoting.processlifecycleapplication;
    2. import android.app.Application;
    3. import androidx.lifecycle.ProcessLifecycleOwner;
    4. public class MyApplication extends Application {
    5. ApplicationObserver mApplicationObserver;
    6. @Override
    7. public void onCreate() {
    8. mApplicationObserver = new ApplicationObserver();
    9. ProcessLifecycleOwner.get().getLifecycle().addObserver(mApplicationObserver);
    10. super.onCreate();
    11. }
    12. }

             观察者ApplicationObserver.java。

    1. package com.gaoting.processlifecycleapplication;
    2. import android.util.Log;
    3. import androidx.lifecycle.Lifecycle;
    4. import androidx.lifecycle.LifecycleObserver;
    5. import androidx.lifecycle.OnLifecycleEvent;
    6. public class ApplicationObserver implements LifecycleObserver {
    7. String TAG = "ApplicationObserver";
    8. /**
    9. * 整个应用程序只感知1次
    10. */
    11. @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    12. public void onCreate(){
    13. Log.i(TAG,"ApplicationObserver.onCreate()应用程序启动");
    14. }
    15. /**
    16. * 应用程序打到前台
    17. */
    18. @OnLifecycleEvent(Lifecycle.Event.ON_START)
    19. public void onStart(){
    20. Log.i(TAG,"ApplicationObserver.onStart()应用程序在前台");
    21. }
    22. /**
    23. * 应用程序推到后台
    24. */
    25. @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    26. public void onResume(){
    27. Log.i(TAG,"ApplicationObserver.onResume()应用程序在前台");
    28. }
    29. /**
    30. * 应用程序推到后台
    31. */
    32. @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    33. public void onPause(){
    34. Log.i(TAG,"ApplicationObserver.onPause()应用程序退到后台");
    35. }
    36. /**
    37. * 应用程序销毁,感知不到
    38. */
    39. @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    40. public void onDestroy(){
    41. Log.i(TAG,"ApplicationObserver.onStop()应用程序销毁");
    42. }
    43. }

             AndroidManifest.xml中要增加一行:

                    android:name=".MyApplication"。

    1. "1.0" encoding="utf-8"?>
    2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    3. xmlns:tools="http://schemas.android.com/tools">
    4. <application
    5. android:name=".MyApplication"
    6. android:allowBackup="true"
    7. android:dataExtractionRules="@xml/data_extraction_rules"
    8. android:fullBackupContent="@xml/backup_rules"
    9. android:icon="@mipmap/ic_launcher"
    10. android:label="@string/app_name"
    11. android:roundIcon="@mipmap/ic_launcher_round"
    12. android:supportsRtl="true"
    13. android:theme="@style/Theme.ProcessLifecycleApplication"
    14. tools:targetApi="31">
    15. <activity
    16. android:name=".MainActivity"
    17. android:exported="true">
    18. <intent-filter>
    19. <action android:name="android.intent.action.MAIN" />
    20. <category android:name="android.intent.category.LAUNCHER" />
    21. intent-filter>
    22. activity>
    23. application>
    24. manifest>

            测试,把应用启动,转入后台、回到前台等,然后观察Logcat打印日志。

                   

  • 相关阅读:
    Flink 数据目录体系:深入理解 Catalog、Database 及 Table 概念
    像闪电般击碎天空吧——快速轻量化模型之 SDXL-Lightning
    充电桩软硬件,赚钱新招数!-慧哥充电桩开源系统
    秒杀实现技巧
    5359: 【图论】有向图连接边数(图的遍历前置)
    QGIS提取两条线元素的交点
    leetcode 817. 链表组件(java)
    MyBatis:配置文件
    【多条件筛选】js简单实现多条件过滤数组对象,返回新的数组
    app稳定性测试-iOS篇
  • 原文地址:https://blog.csdn.net/huaqianzkh/article/details/139413777