Android Activity生命周期

生命周期的概念

Activity类一共有六个重要的回调:   onCreate() onStart() , onResume() onPause() onStop() , 和  onDestroy()。Activity每进入一个新的状态,系统都会触发相应的回调。


生命周期回调

onCreate()

这是必须实现的一个方法,当系统第一次创建Activity的时候将会触发。当Activity被创建后,Activity进入Created状态。在onCreate()方法中,要实现基本的应用启动逻辑,这些逻辑在Activity的整个生命周期只执行一次。比如,将数据绑定到list,初始化后台线程,实例化一些类级别的变量。方法接受一个savedInstanceStater参数,这是一个Bundle对象,包含Activity上一次执行保存的状态。如果Activity从来没有存在过,那么这个Bundle将会为null。
下面是一个例子:
TextView mTextView;

// some transient state for the activity instance
String mGameState;

@Override
public void onCreate(Bundle savedInstanceState) {
    // call the super class onCreate to complete the creation of activity like
    // the view hierarchy
    super.onCreate(savedInstanceState);

    // recovering the instance state
    if (savedInstanceState != null) {
        mGameState = savedInstanceState.getString(GAME_STATE_KEY);
    }

    // set the user interface layout for this Activity
    // the layout file is defined in the project res/layout/main_activity.xml file
    setContentView(R.layout.main_activity);

    // initialize member TextView so we can manipulate it later
    mTextView = (TextView) findViewById(R.id.text_view);
}

// This callback is called only when there is a saved instance previously saved using
// onSaveInstanceState(). We restore some state in onCreate() while we can optionally restore
// other state here, possibly usable after onStart() has completed.
// The savedInstanceState Bundle is same as the one used in onCreate().
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
    mTextView.setText(savedInstanceState.getString(TEXT_VIEW_KEY));
}

// invoked when the activity may be temporarily destroyed, save the instance state here
@Override
public void onSaveInstanceState(Bundle outState) {
    out.putString(GAME_STATE_KEY, mGameState);
    out.putString(TEXT_VIEW_KEY, mTextView.getText());

    // call superclass to save any view hierarchy
    super.onSaveInstanceState(out);

Activity不会再Created状态停留。onCreate()方法执行完之后,Activity将会进入Started状态,系统将会调用onStart()和onResume()方法。

onStart()


当Activity进入Started状态的时候,将会触发这个回调。onStart()回调时Activity对用户可见,应用准备将Activity调入前台,并且可以交互。应用可以在这个方法中实现初始化UI的代码。也可以注册用来监听UI变化的广播接收器。onStart()方法完成的非常快,并且应用不会再Started状态停留太长时间。这个回调执行完成之后,app将进入Resumed状态,并且触发onResume()回调。

onResume()

Activity进入Resumed状态后,将会被调入前台,并且触发onResume()回调。app在该状态下实现与用户的交互。app将停留在该状态,直到某些事件发生,将焦点从该app移除,比如,接到一个电话,用户转移到了另一个Actilvity,或者关闭屏幕。
当某个中断事件发生时,Activity进入Paused状态,并且触发onPaused()回调。
如果app从Paused状态回调Resumed状态,系统将会重新调用onResume()方法。所以,应该在onResume()方法中初始化在onPause()中释放的元素。
要注意的是,每次Activity进入前台,系统都会调用onResume()回调,包括第一次创建的时候。

onPause()

系统调用onPause()作为用户离开Activity的第一个信号。在onPause()方法中暂停那些在Paused状态中不需要继续执行,并且希望不久后恢复的操作,比如动画,音乐播放等。
可以在onPause()方法中释放系统资源,比如广播接收器,或者其它任意可能影响电池寿命的资源。
onPause()的执行非常短暂,没有足够的时间去执行保存操作。所以,不要在onPause()中执行保存应用或用户数据的行为,网络请求,或者数据库事务。这些方法在onPause()结束之前可能无法完成。相反,应该把这些重负荷的关闭操作放在onStop()方法中。
onPause()调用完成并不意味着Activity离开了Paused状态。想法的,Activity将会停留在该状态,直到Activity被回复,或者变成对用户的完全不可见。如果Activity被恢复,那么系统将会重新调用onResume()。如果Activity变得完全不可见,那么系统将会调用onStop()。

onStop()

当Activity不再对用户可见的时候,将会渐入Stoped状态,系统触发onStop()回调。这可能发生在一个新的Activity覆盖了整个屏幕的情况下。当Activity结束运行,并且将被终止的情况下,系统也会调用onStop()。
在onStop()方法中,应用要释放大部分不再需要的资源。比如,在onStart()方法中注册的广播接收器,在onStop()方法中要解注册。有可能造成内存泄漏的资源也一定要记得在onStop()方法中释放,因为系统有可能在Activity的onDestroy()方法没有被调用的情况下就杀死Activity所在的进程。
CPU密集型的关闭操作也应该在onStop()方法中执行。比如,如果找不到更合理的时机来保存数据到数据库,那么就在onStop()中来执行。
当Activity进入Stopped状态的时候,Activity对象仍然驻留在内存:保留着所有状态和成员信息,但是没有附加到window manager。当Activity恢复的时候,将会重新调用这些信息。系统会记录layout中的每一个View对象,所以如果用户在Edittext控件中输入了文字,这些内容将会被保留,所以不需要专门的保存和恢复。
从Stopped状态,Activity要么恢复与用户的交互,要么结束运行。如果Actvity返回的话,系统将会调用onRestart();如果Activiy结束运行,系统将会调用onDestroy()。

onDestroy()

当Activity被销毁之前调用。这是Activity接收的最后一个回调。系统触发这个回调可能是finish()被调用,或者是系统为了节约空间而临时销毁Activity所在的进程。使用isFinishing()方法可以区分这两种状态。应用方向变化的时候,系统也可能触发这个回调,然后马上调用onCreate()在一个新的方向上重新创建Activity。
onDestroy()将会释放所有在之前状态中没有被释放的资源。

在不同的Activity之间切换

在app运行期间,app可能多次进入和退出同一个Activity。比如,用户按下Back键,或者Activity需要启动另一个Activity。

从另一个Activity启动Activity

Activity经常会需要启动另一个Activity。取决于当前的Activity是否需要从新的Activity获取结果,可以使用startActilvity()或者startActivityForResult()。在两种方式下,都需要传入一个Intent作为参数。
Intent指定将要启动的Activity或者描述将要执行的行为。

在Activity之间协调

当一个Activity启动了另一个Activity,二者的生命周期都会发生变化。第一个Activity停止执行,进入Paused或者Stopped状态,而另一个Activity则被创建。如果这两个Activity之间共享保存到硬盘或者其它地方的数据,一定要明白当第二个Activity创建的时候,第一个Activity并没有被完全停止。第二个Activity的创建过程和第一个activity的停止过程是重叠的。
生命周期回调的顺序定义的很好,但是当同一个进程中的一个Activity启动另一个Activity时,则有些不同。当A activity启动B Activity时的执行顺序如下:
1. 执行Activity A的onPause()方法。
2. 执行Activity B的onCreate,onStart(),onResume方法,Activity B现在获取了用户焦点。
3. 如果Activity A不再可见,它的onStop()方法将会被调用。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值