1、使用Lifecycle解藕页面和组件,直接看activity代码
这是没有使用lifecycle写的代码
package com.nyw.lifecycledemo;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.os.SystemClock;
import android.view.View;
import android.widget.Button;
import android.widget.Chronometer;
/***
* Jetpack
* 我们实现统计一个用户使用APP时间,传统写法都写在Activity生命周期关联一起,无法在其他位置执行,使用Lifecycle实现,则不需要在activity里执行
*/
public class MainActivity extends AppCompatActivity {
private Chronometer ct_text_time;
private long elapsedTime;
private Button btn_LifeCycle;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView() {
ct_text_time=findViewById(R.id.ct_text_time);
findViewById(R.id.btn_LifeCycle).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//打开 新的页面测试 Lifecycle解藕,在做一些业务需要在activity生命周期里执行的业务,现在不需要把代码写到activity都可以在生命周期执行
Intent intent=new Intent(MainActivity.this,LifecycleTestView.class);
startActivity(intent);
}
});
}
@Override
protected void onResume() {
super.onResume();
//获取现在时间减暂停使用时间回到上次使用时间
ct_text_time.setBase(SystemClock.elapsedRealtime()-elapsedTime);
ct_text_time.start();
}
@Override
protected void onPause() {
super.onPause();
//获取系统时间减上次使用时间
elapsedTime=SystemClock.elapsedRealtime()-ct_text_time.getBase();
ct_text_time.stop();
}
}
使用 Lifecycle实现的代码
自定义一个Chronometer
package com.nyw.lifecycledemo;
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 MyChronomcler extends Chronometer implements LifecycleObserver {
private long elapsedTime;
public MyChronomcler(Context context, AttributeSet attrs) {
super(context, attrs);
}
//添加注解实现生命周期方法
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
private void startMeter(){
//获取现在时间减暂停使用时间回到上次使用时间
setBase(SystemClock.elapsedRealtime()-elapsedTime);
start();
}
//添加注解实现生命周期方法
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
private void stopMeter(){
//获取系统时间减上次使用时间
elapsedTime=SystemClock.elapsedRealtime()-getBase();
stop();
}
}
package com.nyw.lifecycledemo;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
/**
* 使用Lifecycle解藕页面和组件
* 新的页面测试 Lifecycle解藕,在做一些业务需要在activity生命周期里执行的业务,现在不需要把代码写到activity都可以在生命周期执行
*/
public class LifecycleTestView extends AppCompatActivity {
private MyChronomcler chronomcler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_lifecycle_test_view);
chronomcler=findViewById(R.id.chronomcler);
//Lifecycle 监听设置
getLifecycle().addObserver(chronomcler);
}
}
activity_lifecycle_test_view.xml
2、 Lifecycle解藕Service与组件
使用前在build.gradle必须引入如下
implementation "android.arch.lifecycle:extensions:1.0.0-alpha4"
plugins {
id 'com.android.application'
}
android {
compileSdk 31
defaultConfig {
applicationId "com.nyw.lifecycledemo"
minSdk 21
targetSdk 31
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'com.google.android.material:material:1.3.0'
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
testImplementation 'junit:junit:4.+'
androidTestImplementation 'androidx.test.ext:junit:1.1.2'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
//lifecycle
implementation "android.arch.lifecycle:extensions:1.0.0-alpha4"
}
activity代码
package com.nyw.lifecycledemo.activity;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import com.nyw.lifecycledemo.R;
import com.nyw.lifecycledemo.service.MyLocationService;
/**
* Lifecycle解藕Service与组件
* 通过启动一个服务获取GPS变化显示出来
*/
public class LifeCycleServiceAndView extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_life_cycle_service_and_view);
}
public void stopGPS(View view) {
stopService(new Intent(this, MyLocationService.class));
}
public void startGPS(View view) {
startService(new Intent(this, MyLocationService.class));
}
}
xml代码
服务代码
package com.nyw.lifecycledemo.service;
import android.app.Service;
import android.util.Log;
import androidx.lifecycle.LifecycleService;
public class MyLocationService extends LifecycleService {
public MyLocationService(){
Log.i("ndfsksfjskf","MyLocationService");
MyLocationObserver myLocationObserver=new MyLocationObserver(this);
getLifecycle().addObserver(myLocationObserver);
}
}
代码
package com.nyw.lifecycledemo.service;
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.annotation.NonNull;
import androidx.core.app.ActivityCompat;
import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleObserver;
import androidx.lifecycle.OnLifecycleEvent;
import java.util.List;
public class MyLocationObserver implements LifecycleObserver {
private Context context;
private LocationManager locationManager;
private MyLocationListener myLocationListener;
public MyLocationObserver(Context context) {
this.context = context;
}
//Lifecycle是通过注解方式实现生命周期方法
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
public void startGetLocation() {
Log.i("dsflfjksfksfs","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.i("dsflfjksfksfs","stopGetLocation");
locationManager.removeUpdates(myLocationListener);
}
static class MyLocationListener implements LocationListener{
@Override
public void onLocationChanged(@NonNull Location location) {
Log.i("dsflfjksfksfs","location changed"+location.toString());
}
@Override
public void onLocationChanged(@NonNull List locations) {
}
@Override
public void onFlushComplete(int requestCode) {
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
@Override
public void onProviderEnabled(@NonNull String provider) {
}
@Override
public void onProviderDisabled(@NonNull String provider) {
}
}
}
AndroidManifest.xml
activity 代码中要添加动态授权
private void authorization() {
//判断权限
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
!= PackageManager.PERMISSION_GRANTED) {
//请求权限
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.ACCESS_FINE_LOCATION,}, MY_PERMISSION_REQUEST_CODE);
}else {
//6.0系统以下业务操作
}
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case MY_PERMISSION_REQUEST_CODE:
boolean isAllGranted = true;
// 判断是否所有的权限都已经授予了
for (int grant : grantResults) {
if (grant != PackageManager.PERMISSION_GRANTED) {
isAllGranted = false;
break;
}
}
//做业务处理或提醒用户开启权限
if (isAllGranted) {
// 如果所有的权限都授予了, 则执行业务处理代码
} else {
// 弹出对话框告诉用户需要权限的原因, 并引导用户去应用权限管理中手动打开权限按钮
Toast.makeText(getApplicationContext(), "获取权限失败,可能部分功能无法正常使用,请到应用权限管理中手动打开权限按钮", Toast.LENGTH_SHORT).show();
}
}
}
3、使用ProcessLifecycleOwner监听程序的生命周期
package com.nyw.lifecycledemo;
import android.app.Application;
import androidx.lifecycle.ProcessLifecycleOwner;
/**
*ProcessLifecycleOwner是对整个应用程序生命周期的监听,不是单个activity数量无关系
*/
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
ProcessLifecycleOwner.get().getLifecycle().addObserver(new ApplicationObserver());
}
}
package com.nyw.lifecycledemo;
import android.util.Log;
import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleObserver;
import androidx.lifecycle.OnLifecycleEvent;
/**
*
*/
public class ApplicationObserver implements LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
private void onCreate(){
//只会被调用一次
Log.i("sdfksjfdksfsjfd","Lifecycle.Event.ON_CREATE");
}
@OnLifecycleEvent(Lifecycle.Event.ON_START)
private void onStart(){
Log.i("sdfksjfdksfsjfd","Lifecycle.Event.ON_START");
}
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
private void onResume(){
Log.i("sdfksjfdksfsjfd","Lifecycle.Event.ON_START");
}
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
private void onPause(){
Log.i("sdfksjfdksfsjfd","Lifecycle.Event.ON_PAUSE");
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
private void onstop(){
Log.i("sdfksjfdksfsjfd","Lifecycle.Event.ON_STOP");
}
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
private void onDestroy(){
//不会被调用
Log.i("sdfksjfdksfsjfd","Lifecycle.Event.ON_DESTROY");
}
}
最后记得在AndroidManifest.xml添加
android:name=".MyApplication"