android lifecycle使用

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"



    
    
    
        
        
        
            
                

                
            
        

        
    

 

 

 
  

你可能感兴趣的:(android开发,android)