Android:Activity的生命周期

Activity生命周期的状态

Android:Activity的生命周期_第1张图片
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的状态

Android:Activity的生命周期_第2张图片
    @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

你可能感兴趣的:(Android:Activity的生命周期)