zoukankan      html  css  js  c++  java
  • android菜鸟学习笔记9----Activity(二)

    关于Activity的生命周期

    下面是Activity整个生命周期中,状态发生变化时所回调的方法,它们对应着Activity完整的生命过程。

     

    void  onCreate(Bundle savedInstanceState):Activity被创建时回调

    void  onStart()  :在onCreate()或者onRestart()之后被调用,即Activity第一次创建或者从不可见变为可见状态时调用。

    void  onResume()  :恢复到活动状态时回到,在onStart()之后一定会调用该方法。之后该活动就处于活动状态了,处于任务栈的栈顶。

    void  onPause()  :失去焦点,但是仍然部分可见时回调。

    void  onStop()  :Activity变为完全不可见时回调

    void  onRestart()  :Activity重新启动时回调

    void  onDestroy()  :Activity被销毁前回调

    上面的7个方法,除了onRestart()之外,在生命周期的图中都是成对出现的。分为三对,也就出现了三种生存期。

    从onCreate()到onDestroy(),一个Activity实例经历了创建到销毁的所有过程,被称之为完整生存期

    从onStart()到onStop(),一个Activity实例从可见状态变为不可见状态,被称之为可见生存期。注意,可见并不一定处于栈顶,因而并一定能与用户交互。

    从onResume()到onPause(),一个Activity实例经历了从活动状态到暂停状态,这两个方法之间的过程,该Activity实例都处于活动状态,被称之为前台生存期,或者活动状态生存期

    完整生命周期程序演示,参考《第一行代码》

    程序有三个Activity:MainActivity是入口,放置两个按钮,分别用于启动另外两个Activity,实现7个生命周期回调方法,分别输出一条运行信息;NormalActivity就是一个普通的Activity;DialogActivity在Manifest.xml中配置了theme属性,使其成为一个对话框样式的Activity,<activity android:name=".DialogActivity" android:theme="@android:style/Theme.Dialog"></activity>。

    具体代码:

    main_layout.xml:

     1 <?xml version="1.0" encoding="utf-8"?>
     2 
     3 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     4 
     5     android:layout_width="match_parent"
     6 
     7     android:layout_height="match_parent"
     8 
     9     android:orientation="vertical" >
    10 
    11     <Button
    12 
    13         android:id="@+id/normal"
    14 
    15         android:layout_width="wrap_content"
    16 
    17         android:layout_height="wrap_content"
    18 
    19         android:text="@string/start_normal_activity"/>
    20 
    21     <Button
    22 
    23         android:id="@+id/dialog"
    24 
    25         android:layout_width="wrap_content"
    26 
    27         android:layout_height="wrap_content"
    28 
    29         android:text="@string/start_dialog_activity"/>
    30 
    31 </LinearLayout>

    MainActivity.java:

      1 public class MainActivity extends ActionBarActivity implements OnClickListener {
      2 
      3       @Override
      4 
      5       public void onClick(View view) {
      6 
      7            // TODO Auto-generated method stub
      8 
      9            switch (view.getId()) {
     10 
     11            case R.id.normal:
     12 
     13                  Intent intent1 = new Intent(this, NormalActivity.class);
     14 
     15                  startActivity(intent1);
     16 
     17                  break;
     18 
     19            case R.id.dialog:
     20 
     21                  Intent intent2 = new Intent(this, DialogActivity.class);
     22 
     23                  startActivity(intent2);
     24 
     25            default:
     26 
     27                  break;
     28 
     29            }
     30 
     31       }
     32 
     33       @Override
     34 
     35     protected void onCreate(Bundle savedInstanceState) {
     36 
     37         super.onCreate(savedInstanceState);
     38 
     39         setContentView(R.layout.main_layout);
     40 
     41         Log.i("LIFECYCLE","onCreate");
     42 
     43         Button btnNormal = (Button) findViewById(R.id.normal);
     44 
     45         Button btnDialog = (Button) findViewById(R.id.dialog);
     46 
     47         btnNormal.setOnClickListener(this);
     48 
     49         btnDialog.setOnClickListener(this);
     50 
     51     }
     52 
     53       @Override
     54 
     55       protected void onStop() {
     56 
     57            // TODO Auto-generated method stub
     58 
     59            super.onStop();
     60 
     61            Log.i("LIFECYCLE","onStop");
     62 
     63       }
     64 
     65       @Override
     66 
     67       protected void onDestroy() {
     68 
     69            // TODO Auto-generated method stub
     70 
     71            super.onDestroy();
     72 
     73            Log.i("LIFECYCLE","onDestroy");
     74 
     75       }
     76 
     77       @Override
     78 
     79       protected void onPause() {
     80 
     81            // TODO Auto-generated method stub
     82 
     83            super.onPause();
     84 
     85            Log.i("LIFECYCLE","onPause");
     86 
     87       }
     88 
     89       @Override
     90 
     91       protected void onStart() {
     92 
     93            // TODO Auto-generated method stub
     94 
     95            super.onStart();
     96 
     97            Log.i("LIFECYCLE","onStart");
     98 
     99       }
    100 
    101       @Override
    102 
    103       protected void onRestart() {
    104 
    105            // TODO Auto-generated method stub
    106 
    107            super.onRestart();
    108 
    109            Log.i("LIFECYCLE","onRestart");
    110 
    111       }
    112 
    113       @Override
    114 
    115       protected void onResume() {
    116 
    117            // TODO Auto-generated method stub
    118 
    119            super.onResume();
    120 
    121            Log.i("LIFECYCLE","onResume");
    122 
    123       }
    124 
    125 }

    运行信息:

    首先启动该应用程序,依次输出:

     

    可见,正如生命周期图中所示,依次调用了onCreate()、onStart()、onResume()。

    然后点击第一个按钮,启动那个普通的Activity,依次输出:

     

    可见,当NormalActivity启动时,MainActivity调用onPause()进入暂停状态,由于NormalActivity启动后,MainActivity被NormalActivity完全遮住时,又要调用onStop()进入停止状态。

    然后,点击模拟器的返回按钮,依次输出:

     

    可见,由于按下返回键后,NormalActivity被销毁,MainActivity由不可见状态变为可见状态,则依次调用onRestart()、onStart(),又由于MainActivity当前处于任务栈栈顶,所以又调用onResume()进入活动状态。

    然后,点击第二个按钮,启动DialogActivity,依次输出:

     

    由于MainActivity仍然有部分可见,只是当前不再处于任务栈栈顶而已,所以调用了onPause()进入暂停状态。

    然后,按下模拟器上的返回按钮,依次输出:

     

    DialogActivity被销毁,MainActivity重新回到栈顶,调用onResume()进入活动状态。

    然后,再按下模拟器上的返回按钮,依次输出:

     

    MainActivity要被销毁,从活动状态到销毁状态,依次调用了onPause()、onStop()和onDestroy()。

    以上就是一个完整的Activity生命周期演示。

    此外,由于停止状态和暂停状态的Activity有可能被系统回收资源,当一个Activity从暂停或者停止状态重新回到活动状态时,由于可能已经被回收依次,之前的操作、数据等,如填写了好大一张表单,全都要重新开始,用户体验极差。这时,就要用到涉及Activity实例状态保存的回调函数:

    onSaveInstanceState(Bundle bundle):用于在被系统回收之前,将需要保存的一些Activity实例状态信息,重要数据等保存到bundle对象中。当该Activity实例下次被创建时,调用onCreate(Bundle bundle)方法时,这个bundle对象会传递给onCreate()方法,则可以在onCreate方法中,获取到上次保存的数据,进行相应的初始化,恢复工作。

  • 相关阅读:
    设计模式
    包装类
    php 闭包的理解
    is_null empty isset等的判定
    PHP基础一 $this ,static 和 self的区别
    lumen安装踩过得坑
    composer的使用和安装
    使用submine来写c++
    php 和 thinkphp中的常量一览
    路径问题 ./ / ../ 空 的区别
  • 原文地址:https://www.cnblogs.com/dqrcsc/p/4605832.html
Copyright © 2011-2022 走看看