Activity 的生命周期学习--android

一、Activity的生命周期

好好理解Activity的生命周期是非常重要的。可以确保你的应用程序给用户提供一个完美的用户体验并适当的管理资源。

和前面介绍Application一样,Application不能自己控制自己的进程生命周期,android系统运行时会管理每一个应用程序的进程,包括在应用程序里面的所有Activity。

当运行时需要终止并管理一个Activity的进程,这个Activity的状态会决定它所在的父应用程序的优先级。接着,应用程序的优先级也会影响运行时,可能会终止该应用程序。

1、Activity 栈

每一个Activity的状态会决定它在Activity栈中的位置,按照先进后出的方式组织现在所运行的所有的Activity,当一个新Activity启动时,当前位于前台的屏幕的将会移动到栈顶,如果用户点击了退后按钮,或者这个前台的Activity关闭了,栈中的下一个Activity会移动上来,并且处于活动状态,下图说明了这个过程:

根据前面的说明,应用程序的优先级取决于它包含的最高优先级的Activity,当android的内存管理决定终止哪一个Application以释放资源,也是使用这个栈决定建立在这些Activity上面的应用程序的优先级。

2、Activity 状态

一个Activity从建立到销毁也就是移入到移出栈,这个过程通常可能包含以下四个状态:

(1)、Active 获得状态,当一个Activity位于栈顶并显示在前台,等待获得用户输入命令,android系统会尝试付出所有可能的资源保证它的运行,必要时会杀死一些在栈中位于比较靠后的一些Activity,以确保它需要的资源,当另外一个Activity变成Active状态,那么这个将会进入暂停状态。

2、Paused 暂停状态,有些情况下,你的应用程序会可见,但是不是获得用户输入的焦点,这种情况就是进入了暂停状态,出现这种状态也是是有一个半透明的或者不是全屏的Activity在它前面处于获得状态,当进入暂停状态,它会和处于获得状态一样对待,只是它不能获得用户的输入而已。只有在极端的情况下,android会为了当前活动的Activity杀死一个暂停的Activity以释放资源,当一个Activity变得完全不可见,那么它就进入停止状态了。

3、Stopped 停止状态,当一个Activity不可见了,那么它就进入停止状态了,这个Activity依然会在内存中,保存所有的信息状态,然而,它现在已经是在等候系统的终止了,只要系统其他任何情况需要内存的时候。当一个Activity终止时,最重要的是要保存数据和当前的UI状态,当一个Activity已经退出或者关闭时,那么它就进入不活动状态了。

4、Inactive 不活动状态,当一个Activity已经给杀死了,在它再次启动前,它是不活动的状态,不活动的Activity是已经从Activity中移除的,当它再次需要展示或者使用时,是需要从新开始的。

状态的改变是不确定的,并完全由android的内存管理器确定的,android会先关闭包含不活动的Activity的应用程序,接着是已经停止的,极端情况下是移除暂停的。

为了确保提供完美的用户体验,在状态切换的时候对用户而言是不可见的,状态切换到暂停,停止,或者不活动状态,对用户而言是没有说明不同的,最重要的是当Activity进入暂停或者停止状态时要保存UI的状态和数据,当Activity再次变成活动状态可以重新加载已保存的数据。

3、监听状态的改变

为了能作用于Activity状态的改变,android提供了一系列的事件控件,当Activity切换所有的状态时都会启动这些对应的事件,包括这个生命周期,可见周期,活动周期等,下图描述了Activity的整个状态的变换。

下面Activity实现了上面说提到的所有的事件。

package com.example.activitylifetime;
import android.os.Bundle;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.content.Intent;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.Toast;
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 初始化 activity.
    Log.e("onCreate", "第一个运行,在这个生命周期中只会运行一次。");
}

@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
Log.e("onRestoreInstanceState", "从savedInstanceState对象中重新恢复UI的状态。");

}

@Override
public void onRestart() {
super.onRestart();
Log.e("onRestart", "再次可见运行");
}

@Override
public void onStart() {
super.onStart();
Log.e("onStart", "生命周期中运行多次,当前的Activity可见,相对onResume重量级");
}

@Override
public void onResume() {
super.onResume();
Log.e("onResume", "当前Activity在活动状态时,一般可以更新UI的状态,线程的启动,注册监听器等等");
// Resume any paused UI updates, threads, or processes required
// by the activity but suspended when it was inactive.
}

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
super.onSaveInstanceState(savedInstanceState);
Log.e("onSaveInstanceState", "保存UI状态的更新信息到savedInstanceState对象中");
}
@Override
public void onPause() {
super.onPause();
Log.e("onPause", "当前Activity不是当前的与用户交互的状态,一般注销监听器等等");
}
// Called at the end of the visible lifetime.
@Override
public void onStop() {

super.onStop();
Log.e("onStop", "当前的Activity不可见");
}
// Called at the end of the full lifetime.
@Override
public void onDestroy() {
super.onDestroy();
Log.e("onDestroy", "清空所有的资源,关闭数据库连接等等");
}
}

二、明白Activity生命周期

在一个完整的Activity生命周期里面,经历了从建立到销毁的过程,也许会经过一个或者多个活动周期和可见周期。每一个状态的转换都会触发上面所描述的一个事件,下面就上面说到的每一个生命周期和相关的事件深入的探讨一下。

1、full lifeTime 完整的生命周期

完整的生命周期是你的Activity从开始调用onCreate 方法,到最后调用onDestroy结束。当然也有可能,在一些极端的情况下,没有调用onDestroy方法,Activity的进程就已经给终止了。

使用onCreate方法初始化你的Activity:载入用户界面,分配类变量值,绑定数据到控件中,建立服务和建立线程等。这个onCreate方法使用一个包含UI状态的Bundle对象,这个状态时在最后访问onSaveInstanceState方法保存的,恢复Activity的状态,你可以使用Bundle对象恢复用户界面之前的状态下的数据,你可以通过这个onCreate方法或者重写onRestoreInstanceState方法。

重写onDestro清理一些在onCreate方法中创建的资源,确保所有的外部链接,比如网络或者数据库都已经关闭了。

根据android用户手册的说明,要编写高效的代码,最推荐的方式是尽力避免建立一些短期的实例对象,快速的的建立和销毁对象和加重额外的垃圾回收,进程会直接影响用户的体验,如果你的应用程序要重复的建立一组相同的对象,那么你可以考虑一下在onCreate方法中建立,那么这些对象在Activity生命周期中只会建立一次。

2、Visible lifetime 可见生命周期

Activity的可视化生命周期是在onStart方法和onStop两个方法之间,在这些方法给调用是你的Activity是展示给用户,尽管它可能还么有获得用户输入的焦点,或者有部分是不能完全展示,当应用程序在前台和后台的切换过程中,一个Activity可能会在整个生命周期中多次的进入这个可见生命周期。然而也有一些特殊的情况,android应用程序可能会杀死一个正处于该生命周期的Activity,这样该Activity可能就没有调用onStop方法。

这个onStop方法一般适合用于暂停或者停止动画,线程,感应事件,GPS导航,定时器,服务,或者其他一些专门更新用户界面的进程,有一些消耗性资源当它不可见时需要更新。当UI再次可见时使用onStart方法可以重新获得或者重启这个进程。

这个onRestart会在停止后和onStart方法执行前马上被调用,重写这个方法一般是在你需要重新启动时候处理一些事件的时候。

 onStart和onStop方法一般是用于注册和注销广播接收器,这个广播接收器是用于独立的更新用于界面的。以后我们会详细接收广播接收器。

3、Active lifetime  活动生命周期

活动周期是以调用onResume方法开始和以调用onPause结束的。

一个活动的Activity是指在前台运行并且获得用户的输入时间,一个Activity销毁前可能会经历很多次这个过程,在一个新的Activity展示,或者设配休眠,又或者当前的Activity失去焦点的时候,那么Activity的活动周期都会结束。保证在onResume和onPause方法里面的代码都是相对比较快的和轻量级的,这样可以保证你的应用程序流畅的在前后台切换。

在执行onPause方法之前,需要调用onSaveInstanceState方法,这个方法提供了一个保存Activity的UI的状态在一个Bundle对象中,这个对象会传递给onCreate和onRestoreInstanceState方法中,使用onSaveInstanceState方法保存UI的状态(比如,checkbox有没有选中,input是否获得焦点,已经输入但是还没有提交的数据),这样可以让Activity重新处于活动的时候,能展示相同的界面。在应用程序的进程终止前,onSaveInstanceState和onPause都应该会调用。

大部分Activity重写onPause方法都是为了提交还没有保存的更改,因为应用程序可能会在没有任何警告就会给杀死,所以当你的Activity在前台的时候,你可以根据你的应用程序的结构,适当的选择需要关闭的线程,进程或者广播接收器。

这个onResume方法也是非常轻量级的,你不要在这个方法里面重新加载UI的状态,你可以再这个方法中注册或注销广播接收器和其他的一些进程,这些已经在你的onPause终止了的。

  

三、android提供的Activity类

  android 的 SDK中有一些可选的Activity子类,这些子类包含了一些用户界面非常通用的功能,下面介绍一下最有用的几个:

    1、MapActivity:在一个Activity中可能会需要支持MapView类这个组件,那么就需要使用这个Activity来控制相关的资源。以后的章节中我们会学习到MapView的功能。

    2、ListActivity:可以使用ListView 封装一些数据源,作为一些Activity展示界面时候使用,同时可以响应列表中每一项的事件控制。

    3、ExpandableListActivity:ExpandableListActivity和ListActivity 类似,但是用于支持ExpandableListView。

    4、TabActivity:可以让你嵌入多个Activity或者多个视图在一个屏幕中展示,使用tab组件你可以选择不同的Activity或者视图。

Java免费学习   Java自学网 http://www.javalearns.com

关注微信号:javalearns  ,随时随地学Java

今天看到一个手机也能赚钱的网站,与大家分享(真实可信,已亲身体验):

http://javalearns.jifenqiang.com/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值