Activity生命周期的状态
- Resumed
当Activity位于应用程序的前台时,它是运行中的Activity,用户可见、可
交互。在某一个时间内只有一个Activity处于运行状态。 - Paused
如果Activity失去焦点,被另一个前台Activity部分或全部覆盖,但仍然可见(比如一个更小的Activity出现在栈顶),那么Activity处于暂停状态,此时不接收用户输入,不执行任何代码。 - Stopped
如果Activity被另一个运行中的Activity彻底覆盖,完全隐藏在后台,用户
不可见,处于停止状态。当Activity停止时,将失去所有状态,这样就需要在重启Activity时,重新创建用户界面的当前状态。 - Destroyed
当Activity被暂停或者停止后,系统为了回收内存可以结束它。在这之后
用户可以重新启动Activity - Created和Started
是短暂的,系统快速从它们一个状态切换到下一个状态。系统调用onCreate()后,迅速调用onStart(),接着onResume()。下面我们看看系统对生命周期状态的调用。
Activity生命周期的回调函数
- onCreate(Bundle savedlnstanceState)
在Activity第一次被创建时调用。此时应初始化数据、创建初始视图或者回复Activity之前保存的冻结状态。OnCreate之后通常是调用onStart - onStart()
在Activity变为可见时被调用。这里最适合编写应用程序用户界面的相关代码,如处理与用户交互的事件。OnStart之后通常是调用onResume。但如果Activity变为隐藏的,那么将调用onStop - onResume()
在Activity变为前台运行并且可以与用户交互时被调用。它之后通常是调
用onPause - onPause()
在其他Activity切换到前台时被调用。onPaus的实现必须很快,因为在该
函数返回前,其他Activity不能运行。如果Activity重新回到前台,那么onPaus之后调用的是onResume。如果Activity变为不可见,那么onPause之后调用的是onStop。 - onStop()
在Activity变为不可见时被调用。无论是新Activity被启动(或者已经存在的
Activity被恢复)还是当前Activity被销毁,当前Activity的onStop回调都会被调用。如果Activity重新回到前台,那么onStop之后将调用onRestart - onRestart()
在Activity被重新启动并回到前台时被调用。onRestart之后通常是调用
onStart - onDestroy( )
在 Activity被销毁前被调用,无论是因为Activity运行结束还是因为系统要
回收当前Activity使用的内存,系统均会调用它。
保持Activity的状态
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putLong("startedAt",startedAt);
}
Active正在停止时系统调用onSavelnstaceState(),保存状态带有键一值对集合的状态信息。这个方法默认保存。Active view状态信息,如Ed itText里的文本或ListView的滚动条位置。为保存active附加状态信息,必须实现onSavelnstanceState()、增加键一值对到Bundle对象。
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
startedAt=savedInstanceState.getLong("startedAt");
}
当重建先前销毁的。Active,你能从Bundle恢复保存的、系统传递的状态。onCreate()和onRestoreInstanceState()回调方法都收到同样的、包含状态信息实例的Bundle。因为系统正在创建为你。Activity一个新实例还是重建,onCreate()方法都会调用,你必须检查Bundle。状态是否为空,读取它之前。如果空,系统正在创建。Activity新实例,而不是恢复。
DEMO
调整后的demo,解决了旋转不能计时和计时持续等问题。
package com.github.davidji80.helloworld;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import java.util.Timer;
import java.util.TimerTask;
public class ClockActivity extends AppCompatActivity {
private static String ClASS_NAME="ClockActivity";
protected TextView counter;
protected Button start;
protected Button stop;
//两个按钮互斥变量
protected boolean timerRunning=false;
//时间变量
protected long startedAt;
protected long lastStopped;
/*
创建一个long类型的静态变量UPDATE-ERVERYo
为该变量赋值200,这是更新屏幕counter的频率。
如果设置为1000,那么有可能不能准确地显示每一秒。
*/
private final long UPDATE_EVERY = 200;
//在Activity中定义一个用于更新UI界面的handler类
private Handler handler= new Handler() {
@Override
public void handleMessage(Message msg) {
//判断信息是否是本应用发出的
if (msg.what == 0x123) {
setTimeDisplay();
}
super.handleMessage(msg);
}
};
//定义一个定时器对象
private Timer timer = new Timer();
//在Activity中定义一个继承自TimerTask的UpdateTimer内部类,TimerTask继承自Runnable
private class UpdateTimer extends TimerTask{
@Override
public void run() {
if (handler!=null) {
handler.sendEmptyMessage(0x123);
}
}
}
private UpdateTimer updateTimer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(ClASS_NAME,"----------------onCreate----------------");
setContentView(R.layout.activity_clock);
counter = (TextView) findViewById(R.id.timer);
start = (Button) findViewById(R.id.start_button);
stop = (Button) findViewById(R.id.stop_button);
}
public void clickedStart(View view) {
timerRunning = true;
enableButtons();
updateTimer=new UpdateTimer();
timer.schedule(updateTimer, 0, 200);
startedAt = System.currentTimeMillis();
lastStopped = System.currentTimeMillis();
saveState();
}
public void saveState(){
SharedPreferences sharedPref=this.getSharedPreferences("SAVEDSTART",Context.MODE_PRIVATE);
SharedPreferences.Editor editor=sharedPref.edit();
editor.putBoolean("timerRunning",timerRunning);
editor.commit();
}
public void clickedStop(View view) {
timerRunning = false;
enableButtons();
handler.removeCallbacks(updateTimer);
}
protected void enableButtons() {
start.setEnabled(!timerRunning);
stop.setEnabled(timerRunning);
}
protected void setTimeDisplay() {
String display;
long timeNow;
long diff;
long seconds;
long minutes;
long hours;
if (timerRunning) {
timeNow = System.currentTimeMillis();
} else {
timeNow = lastStopped;
}
diff = timeNow - startedAt;
if (diff < 0) {
diff = 0;
}
seconds = diff / 1000;
minutes = seconds / 60;
hours = minutes / 60;
seconds = seconds % 60;
minutes = minutes % 60;
display = String.format("%d", hours) + ":" + String.format("%02d", minutes) + ":" + String.format("%02d", seconds);
counter.setText(display);
Log.d("startedAt",Long.toString(startedAt));
}
@Override
protected void onStart() {
super.onStart();
Log.d(ClASS_NAME,"----------------onStart----------------");
SharedPreferences sp=this.getSharedPreferences("SAVEDSTART",Context.MODE_PRIVATE);
timerRunning=sp.getBoolean("timerRunning",false);
if (timerRunning){
updateTimer=new UpdateTimer();
timer.schedule(updateTimer, 0, 200);
}
}
@Override
protected void onResume() {
super.onResume();
Log.d(ClASS_NAME,"----------------onResume----------------");
enableButtons();
setTimeDisplay();
}
@Override
protected void onPause() {
super.onPause();
Log.d(ClASS_NAME,"----------------onPause----------------");
}
@Override
protected void onStop() {
super.onStop();
Log.d(ClASS_NAME,"----------------onStop----------------");
if (timerRunning){
handler.removeCallbacks(updateTimer);
}
}
@Override
protected void onRestart() {
super.onRestart();
Log.d(ClASS_NAME,"----------------onStart----------------");
}
@Override
protected void onDestroy() {
super.onDestroy();
android.os.Debug.stopMethodTracing();
Log.d(ClASS_NAME,"----------------onDestroy----------------");
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putLong("startedAt",startedAt);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
startedAt=savedInstanceState.getLong("startedAt");
}
}
代码
https://github.com/DavidJi80/HelloWorld
v0.6