• Android学习笔记(4):Activity生命周期


    前言:

    Activity的生命周期不是自身控制的,而是由Android系统控制的。系统通过调用不同的方法,完成Activity不同状态的转换。本文将通过一个实例来帮助理解Activity生命周期。

    本文要点:

    1.理解生命周期

    2.Activity状态扭转

    一、生命周期概述

    先上图:

    activity_lifecycle

    这幅图已经很完整的描述了Activity的生命周期,以及状态转换。但这里针对上图做几点说明:

    (1)Activity生命周期中,有很多种状态。其中包括Resumed(运行态,可见且可交互),Paused(暂停,部分可见但不可交互),Stoped(停止态,不可见),Destroyed/Killed(销毁)等;

    (2)Entire Lifetime,完整的生命周期从调用onCreate()开始,直至调用onDestroy()结束;

    (3)Visible Lifetime,生命周期中可见的阶段,发生在调用onStart()之后,onStop()之前。处于Resumed,或Paused态,在这期间Activity处于屏幕上;

    (4)Foreground Lifetime,生命周期可交互的阶段,在调用onResume()之后,onPause()之前。在这期间,Activity显示在所有其他Activity之前,并获取输入焦点。

    (5)Android系统通过调用onCreate()方法创建Activity实例.onDestroy()方法释放,关闭Activity;

    (6)Android系统通过栈管理Activities,屏幕最前端的Activity位于栈顶。不在栈顶的Activity一般处于Paused状态,Stoped状态,或者Destroyed中的一种;

    (7)实际应用中,我们通过重载Android生命周期中不同的方法,实现对不同状态下Activity的控制。如:我们可以重载onCreate()方法,实现对数据库的初始化;重写onDestroy(),执行删除数据库操作等。

    二、状态转换实例

    这里继续使用上篇文章中的HelloActivity为例。

    1.我们在MainActivity.java和DisplayMessageActivity.java中,重写(override)上图中的所有给出的方法,除了调用super.onXXX()之外,再添加下面这句代码:

    Log.i("[xxxActivity]", "onXXX()");

    说明:添加该方法目的是为了能在LogCat窗口中输入一段日志,直观显示Activity的调用顺序。

    第一个参数值约定格式为[xxxActivity],用以区别不同Activity的日志,第二个参数用以标示调用了哪一个方法。

    修改后的代码:

    MainActity.java

    View Code
     1 package com.wzhang.helloactivity;
     2 
     3 import android.os.Bundle;
     4 import android.app.Activity;
     5 import android.content.Intent;
     6 import android.util.Log;
     7 import android.view.Menu;
     8 import android.view.View;
     9 import android.widget.EditText;
    10 
    11 public class MainActivity extends Activity {
    12 
    13     public static final String EXTRA_MESSAGE = "com.wzhang.MainActivity.MESSAGE";
    14 
    15 
    16     @Override
    17     protected void onCreate(Bundle savedInstanceState) {
    18         super.onCreate(savedInstanceState);
    19         setContentView(R.layout.main);
    20         Log.i("MainActivity", "onCreate()");
    21     }
    22 
    23     @Override
    24     protected void onStart(){
    25         super.onStart();
    26         Log.i("MainActivity", "onStart()");
    27     }
    28     
    29     @Override
    30     protected void onRestart(){
    31         super.onRestart();
    32         Log.i("MainActivity", "onRestart()");
    33     }
    34     
    35     @Override
    36     protected void onResume(){
    37         super.onResume();
    38         Log.i("MainActivity", "onResume()");
    39     }
    40     @Override
    41     protected void onPause(){
    42         super.onPause();
    43         Log.i("MainActivity", "onPause()");
    44     }
    45     
    46     @Override
    47     protected void onStop(){
    48         super.onStop();
    49         Log.i("MainActivity", "onStop()");
    50     }
    51     @Override
    52     protected void onDestroy(){
    53         super.onDestroy();
    54         Log.i("MainActivity", "onDestroy()");
    55     }
    56     
    57     
    58     @Override
    59     public boolean onCreateOptionsMenu(Menu menu) {
    60         // Inflate the menu; this adds items to the action bar if it is present.
    61         getMenuInflater().inflate(R.menu.main, menu);
    62         return true;
    63     }
    64     
    65 
    66     public void sendMessage(View view){
    67         Intent intent = new Intent(this, DisplayMessageActivity.class);
    68         EditText editText = (EditText) findViewById(R.id.txtMsg);
    69         String message = editText.getText().toString();
    70         intent.putExtra(EXTRA_MESSAGE, message);
    71         startActivity(intent);
    72     }
    73 
    74 }

    DisplayessageActivity.java

    View Code
     1 package com.wzhang.helloactivity;
     2 
     3 import android.os.Bundle;
     4 import android.app.Activity;
     5 import android.content.Intent;
     6 import android.util.Log;
     7 import android.view.Menu;
     8 import android.view.MenuItem;
     9 import android.widget.TextView;
    10 
    11 public class DisplayMessageActivity extends Activity {
    12 
    13     @Override
    14     protected void onCreate(Bundle savedInstanceState) {
    15         super.onCreate(savedInstanceState);
    16 
    17         Intent intent = getIntent();
    18         String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);
    19         // Create the text view
    20         TextView textView = new TextView(this);
    21         textView.setTextSize(40);
    22         textView.setText(message);
    23         
    24         setContentView(textView);        
    25         Log.i("DisplayMessageActivity", "onCreate()");
    26     }
    27     @Override
    28     protected void onStart(){
    29         super.onStart();
    30         Log.i("DisplayMessageActivity", "onStart()");
    31     }
    32     
    33     @Override
    34     protected void onRestart(){
    35         super.onRestart();
    36         Log.i("DisplayMessageActivity", "onRestart()");
    37     }
    38     
    39     @Override
    40     protected void onResume(){
    41         super.onResume();
    42         Log.i("DisplayMessageActivity", "onResume()");
    43     }
    44     @Override
    45     protected void onPause(){
    46         super.onPause();
    47         Log.i("DisplayMessageActivity", "onPause()");
    48     }
    49     
    50     @Override
    51     protected void onStop(){
    52         super.onStop();
    53         Log.i("DisplayMessageActivity", "onStop()");
    54     }
    55     @Override
    56     protected void onDestroy(){
    57         super.onDestroy();
    58         Log.i("DisplayMessageActivity", "onDestroy()");
    59     }
    60 
    61     @Override
    62     public boolean onCreateOptionsMenu(Menu menu) {
    63         getMenuInflater().inflate(R.menu.display_message, menu);
    64         return true;
    65     }
    66 
    67     @Override
    68     public boolean onOptionsItemSelected(MenuItem item) {
    69         return super.onOptionsItemSelected(item);
    70     }
    71 
    72 }

    2.运行HelloActivity,在logCat中观察:

    image

    3.输入Hello Activity 点击send后:

    image

    4.点击image 回退按钮后:

    image

    5.退出HelloActivity后(红色警告我们这里不用理会):

    image

     通过上面的实例,我们可以得到:

    (1)Activity的成功启动,会依次调用:onCreate() -> onStart() -> onResume();(参考上述第2,3点截图)

    (2)关闭一个Activity,系统会依次调用:onPause()->onStop()->onDestroy();(参考第4,5点截图)

    (3)从一个MainActivity跳转到DisplayMessageActivity时,会先调用MainActivity.onPause(),当DispalyMessageActivity打开后,MainActivity会调用onStop()进入Stoped状态;(参考第4点截图)

    (4)关闭DisplayMessageActivity回到MainActivity时,系统先调用DispalyMessageActivity.onPause() ,然后依次调用MainActivity.onRestart()->MainActivity.onStart()->MainActivity.onResume()进入Resumed状态,这之后DisplayMessageActivity才会继续关闭流程,完成Activity的关闭。(见第4点截图)

    注:想深入了解Activity生命周期可参考Android官网的 API Guides

    源码下载:LifeCycleActivity.rar

  • 相关阅读:
    数据库MySQL技术-基础知识
    NC文件的处理【netcdf】
    设计模式-策略模式---Strategy(对象行为型)
    final修饰的变量是引用不能改变,还是引用的对象不能改变
    Spring之配置文件加载方式
    hibernate的基础学习--多表关联数据查询
    hibernate的基础学习--多对多关联
    hibernate的基础学习--一对一关联
    hibernate的基础学习--一对多关联
    hibernate的基础学习
  • 原文地址:https://www.cnblogs.com/pszw/p/2806425.html
Copyright © 2020-2023  润新知