Activity生命周期

Activity的生命周期


1. 概述

应用场合:
          Activity
在运行时会受到一些突然事件的影响,例如:你正使用一个Activity,突然来了一个电话,这时你的应用就要具备处理这些突然事件的能力,要处理这些突然事件,需要用到Activity的生命周期。


Activity有三个状态


Activity在屏幕前台时(位于当前任务堆栈的顶部),它处于激活或运行状态。它可以响应用户操作。


Activity上面有另外一个Activity,上面的Activity没有完全覆盖它,或者上面的activity是透明的,
             
这时下方的Activity仍然对用户可见,下方的Activity就处于暂停状态。
             
被暂停的Activity仍然对用户可见,并且是存活状态(它保留着所有的状态和成员信息并保持和窗口管理器的连接)。
             
如果系统处于内存不足时会杀死这个Activity。 
          
           *
Activity完全被另一个Activity覆盖时则处于停止状态。它仍然保留所有的状态和成员信息。
             
然而对用户是不可见的,所以它的窗口将被隐藏,如果其它地方需要内存,则系统经常会杀死这个Activity

3. 图,这张图比什么都清楚,文档位置在docs/reference/android/app/Activity.html,建议能看英文的哥们直接看文档去,说得太清楚了:


2.Activity从一种状态转变到另一种状态时,会调用以下保护方法来通知这种变化:

voidonCreate(Bundle savedInstanceState) //第一次创建是调用。在Acticity整个生命周期只会被调用一次

void onStart() // onCreate 调用之后就会调用onStart

void onRestart()

void onResume() // onStart 之后调用onRestart。此方法之后Acticity 处于运行(激活)状态。

void onPause() /* 当一个新的Activity 被打开后,原来的Activity 就会调用这个状态。

*如果新打开的Activity 并没有完全覆盖原来的Activity。或者新的Activity 是半透明状态,

*原来的Activity 还可以见。那么就只会调用这个方法,使Activity 处于暂停状态,否则,继续往下调用stop */

void onStop() // 当一个新的Activity 被打开之后,而原来的Activity 被它覆盖掉时,在调完onPause 方法后,就会调用 onStop,使Activity 处于停止状态

void onDestroy()

* Activity 处于暂停状态时。即它的上方有另一个活动的Activity(例如,新的Activity 以对话框形式出现)

当用户点击“后退”按钮,即将上方的Acticity 关掉了。

这时候,将调用onResume 方法。使Acticity 重新处于运行(激活)状态。

只触发一个方法。

* Activity处于停止状态。即它被一个新的Activity 覆盖掉了。

用户通过Activity 回到了前面的一个Activity。将调用其onRestart 方法。

然后调用onStart 方法。

再调用onResume 方法。此方法之后Acticity 重新处于运行(激活)状态。

触发了三个方法。

* 当一个Activity 处于暂停状态 或 停止状态时。

此时,操作系统内存缺乏,它可能会杀死处于这个状态的Activity 。回收内存。

此时用户通过“后退”按钮回到前一个Activity 时,相当于重新执行一遍最开始的线路。从onCreate 方法开始。

* Activity 被销毁的时候,将调用onDestroy

特别注意:在覆盖以上七个方法时,千万不能忘了调用super....不能覆盖了它本身的功能。


3. 试验


view plaincopy toclipboardprint?

public class MainActivityextends Activity {

private static finalString TAG = "MainActivity";

@Override

public voidonCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

Log.i(TAG,"onCreate...");

/* 点击按钮时,切换到另一个Activity,这个 Activity 将会把当前MainActivity 覆盖,使其处于停止状态。*/

findViewById(R.id.button).setOnClickListener(newView.OnClickListener() {

public voidonClick(View v) {

Intent intent= new Intent(MainActivity.this, OtherActivity.class);

startActivity(intent);

}

});

}

@Override

protected voidonStart() {

Log.i(TAG,"onStart...");

super.onStart();

}

@Override

protected voidonRestart() {

// TODOAuto-generated method stub

super.onRestart();

Log.i(TAG,"onRestart...");

}

@Override

protected voidonResume() {

Log.i(TAG,"onResume...");

super.onResume();

}

@Override

protected voidonPause() {

Log.i(TAG,"onPause...");

super.onPause();

}

@Override

protected voidonStop() {

Log.i(TAG,"onStop...");

super.onStop();

}

@Override

protected voidonDestroy() {

Log.i(TAG,"onDestroy...");

super.onDestroy();

}

}



** MainActivity 第一次创建时,分别依次调用了onCreateonStartonResume

** 当点击按钮切换到OtherActivity 时,调用了onPauseonStop方法。使OtherActivity 处于停止状态

** 当在OtherActivity 点击后退,回到MainActivity 时。Activity由停止状态切换到运行状态。调用了onRestartonStartonResume方法


修改试验

新添加一个ThreeActivity,使其打开方式为对话框样式的Activity:


view plaincopy toclipboardprint?

public voidonCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

Log.i(TAG,"onCreate...");

/* 打开一个覆盖MainActivity Activity*/

findViewById(R.id.button).setOnClickListener(newView.OnClickListener() {

public voidonClick(View v) {

Intent intent= new Intent(MainActivity.this, OtherActivity.class);

startActivity(intent);

}

});

/* 打开一个对话框样式的 Activity,位于MainActivity 上方。并不覆盖 MainActivity*/

findViewById(R.id.button2).setOnClickListener(newView.OnClickListener() {

public voidonClick(View v) {

Intent intent= new Intent(MainActivity.this, ThreeActivity.class);

startActivity(intent);

}

});

}


** 怎样设置ThreeActivity,为对话框样式

AndroidManifest.xml

<activityandroid:name=".ThreeActivity" android:label="第三个Activity" android:theme="@android:style/Theme.Dialog"/>

** 当点击“打开第三个 Activity” 使ThreeActivity弹出,但不覆盖MainActivity

调用了onPause方法

** 点击后退按钮回到MainActivity 调用了onResume 一个方法

4. 关注系统杀死Activity 的情况

Activity 处于暂停或停止状态下,操作系统内存缺乏可能会销毁Activity 。或者其它意外突发情况,Activity被操作系统销毁。内存回收时。

应该按业务需求,处理这种情况。例如,若有比较重要的数据,但是数据还处在运算中,则应该缓存它们。若数据已经是运算完毕的最终数据,则应该对它们进行持久化操作:例如保存到数据库,写往磁盘文件等。

Activity提供了两个事件方法可以实现我们的这种需求:

onSaveInstanceState()onRestoreInstanceState()方法

系统销毁一个Activity时,onSaveInstanceState()会被调用

但是当用户主动去销毁一个Activity时,例如在应用中按返回键,onSaveInstanceState()就不会被调用。

onSaveInstanceState()只适合用于保存一些临时性的状态,而onPause()适合用于数据的持久化保存

view plaincopy toclipboardprint?

public classPreferencesActivity extends Activity {

private Stringname;

protected voidonRestoreInstanceState(Bundle savedInstanceState) {

name =savedInstanceState.getString("name"); //被重新创建后恢复缓存的数据

super.onRestoreInstanceState(savedInstanceState);

}

protected voidonSaveInstanceState(Bundle outState) {

outState.putString("name","liming");//被摧毁前缓存一些数据

super.onSaveInstanceState(outState);

}

}



5. onPause onResume

** 无论新的Activity 是覆盖还是暂停原来的Activity,都会调用原来的Activity onPause 方法

** 无论新的Activity 是覆盖还是暂停原来的Activity,在原来的Activity 重新回到前台的时候,都会调用它的onResume 方法。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值