直接看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();
}
}
<?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">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<Chronometer
android:id="@+id/ct_text_time"
android:layout_width="match_parent"
android:gravity="center"
android:layout_marginTop="20dp"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/btn_LifeCycle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:text="使用LifeCycle实现"/>
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
使用 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解藕,在做一些业务需要在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
<?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=".LifecycleTestView">
<com.nyw.lifecycledemo.MyChronomcler
android:id="@+id/chronomcler"
android:layout_width="match_parent"
android:gravity="center"
android:layout_marginTop="20dp"
android:layout_height="wrap_content"/>
</androidx.constraintlayout.widget.ConstraintLayout>