JetPackandroid技术JetPack学习笔记

JetPack学习笔记之LifeCyCle(二)

2020-08-05  本文已影响0人  秀儿2020

JetPack学习笔记之LifeCyCle(二)

上文介绍了使用LifeCycle监听Activity和Service生命周期变化的方法,本文介绍监听Service和Application的生命周期的方法。

1、监听Service的生命周期

要监听Service的生命周期,需要先引入依赖

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

在创建Service时,将父类修改为LifecycleService,其继承了Service并实现了LifecycleOwner接口,所以创建的Service作为被观察者。

public class LifecycleService extends Service implements LifecycleOwner

完整代码如下所示:

public class MyService extends LifecycleService {
    private static final String TAG = "MyService";
    private MyServiceObserver myServiceObserver;
    public MyService(){
        myServiceObserver = new MyServiceObserver();
        getLifecycle().addObserver(myServiceObserver);
    }

    @Override
    public void onCreate() {
        super.onCreate();
        Log.d(TAG,"onCreate");
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.d(TAG,"onDestroy");
    }
}




/**
 * 项目名称 JetPackPro
 * 创建人 xiaojinli
 * 创建时间 2020/8/5 11:17 AM
 **/
public class MyServiceObserver implements LifecycleObserver {
    private static final String TAG = "MyServiceObserver";

    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    public void startService(){
        Log.d(TAG,"在MyServiceObserver中监听到Service启动 ");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    public void stopService(){
        Log.d(TAG,"在MyServiceObserver中监听到Service停止 ");
    }
}

在Activity中创建两个按钮,一个启动Service,一个停止Service。

    ///启动Service
    public void startService(View view) {
        Intent intent = new Intent(LocationActivity.this,MyService.class);
        startService(intent);
    }

    //关闭Service
    public void stopService(View view) {
        Intent intent = new Intent(LocationActivity.this,MyService.class);
        stopService(intent);
    }

可检测到如下输出

2020-08-05 11:31:56.788 1247-1247/com.example.jetpackpro D/MyService: onCreate
2020-08-05 11:31:56.788 1247-1247/com.example.jetpackpro D/MyServiceObserver: 在MyServiceObserver中监听到Service启动 
2020-08-05 11:31:58.715 1247-1247/com.example.jetpackpro D/MyServiceObserver: 在MyServiceObserver中监听到Service停止 
2020-08-05 11:31:58.715 1247-1247/com.example.jetpackpro D/MyService: onDestroy

可以看出,监听Service生命周期的方法与Activity和Fragment相似,只是需要自己修改父类,其背后的原理依然是观察者模式。

2、使用ProcessLifecycleOwner监听应用程序的生命周期

谷歌提供了一个名为ProcessLifecycleOwner 的类,来监听应用程序的生命周期,可以知道应用程序是处于前台还是后台,或者是从前台切换到后台时可以得到通知。下面介绍其使用方法。

第一步还是引入依赖,引入的依赖,与上面Service中引入的依赖相同。

完整代码如下:

/**
 * 项目名称 JetPackPro
 * 创建人 xiaojinli
 * 创建时间 2020/8/5 11:46 AM
 **/
public class MyLifeApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();

        ProcessLifecycleOwner.get().getLifecycle().addObserver(new ApplicatonOberver());
    }
}




/**
 * 项目名称 JetPackPro
 * 创建人 xiaojinli
 * 创建时间 2020/8/5 11:46 AM
 **/
public class ApplicatonOberver implements LifecycleObserver {
    private static final String TAG = "ApplicatonOberver";

    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    public void onCreate(){
        Log.d(TAG,"onCreate in ApplicatonOberver");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    public void onStart(){
        Log.d(TAG,"onStart in ApplicatonOberver");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    public void onResume(){
        Log.d(TAG,"onResume in ApplicatonOberver");
    }


    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    public void onPause(){
        Log.d(TAG,"onPause in ApplicatonOberver");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    public void onStop(){
        Log.d(TAG,"onStop in ApplicatonOberver");
    }

    /**
     * 该方法永远不会被调用,因为系统不会分发ON_DESTROY事件
     */
    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    public void onDestroy(){
        Log.d(TAG,"onDestroy in ApplicatonOberver");
    }
}


可检测到一下结果:

APP刚启动时会依次执行以下三种方法
2020-08-05 11:52:18.253 1639-1639/com.example.jetpackpro D/ApplicatonOberver: onCreate in ApplicatonOberver
2020-08-05 11:52:18.654 1639-1639/com.example.jetpackpro D/ApplicatonOberver: onStart in ApplicatonOberver
2020-08-05 11:52:18.688 1639-1639/com.example.jetpackpro D/ApplicatonOberver: onResume in ApplicatonOberver
APP切换到后台时会执行以下两种方法
2020-08-05 11:52:31.788 1639-1639/com.example.jetpackpro D/ApplicatonOberver: onPause in ApplicatonOberver
2020-08-05 11:52:31.788 1639-1639/com.example.jetpackpro D/ApplicatonOberver: onStop in ApplicatonOberver
APP再次切换到前台时会执行以下两种方法
2020-08-05 11:52:35.807 1639-1639/com.example.jetpackpro D/ApplicatonOberver: onStart in ApplicatonOberver
2020-08-05 11:52:35.807 1639-1639/com.example.jetpackpro D/ApplicatonOberver: onResume in ApplicatonOberver

可以看出,通过ProcessLifecycleOwner我们可以轻易地检测到APP合适从前台进入到后台,又是何时从后台进入前台,进而可以进行一些业务操作,并且不会增加耦合度。

上一篇下一篇

猜你喜欢

热点阅读