Android官方培训课程-笔记(Activity生命周期)

 1。

  基本的生命周期

这些状态中只有三种可以是静态。也就是说,活动只能在三种状态之一下存在很长时间。

  • 恢复:在这种状态下,活动处​​于前台,且用户可以与其交互。(有时也称为“运行”状态。)
  • 暂停:在这种状态下,活动被在前台中处于半透明状态或者未覆盖整个屏幕的另一个Activity-部分阻挡。暂停的活动不会接收用户输入并且无法执行任何代码。
  • 停止:在这种状态下,活动被完全隐藏并且对用户不可见;它被视为处于后台。停止时,活动实例及其诸如成员变量等所有状态信息将保留,但它无法执行任何代码。

2。

<activity android:name=".MainActivity" android:label="@string/app_name">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

如果程序中没有声明了MAIN  action或者LAUNCHER  category的活动,那么在设备的主界面列表里面不会呈现app图标。

3.如果活动含有在的onCreate调用时创建的后台线程,或者是其他有可能导致内存泄漏的资源,则应该在的OnDestroy()时进行资源清理,杀死后台线程。

4.除非程序在onCreate()方法里面就调用了finish()方法,系统通常是在执行了onPause()与onStop()之后再调用onDestroy()。在某些情况下,例如我们的活动只是做了一个临时的逻辑跳转的功能,它只是用来决定跳转到哪一个活动,这样的话,需要在的onCreate里面调用完成方法,这样系统会直接调用onDestory,跳过生命周期中的其他方法。

5。

当系统调用活动中的onPause(),从技术上讲,意味着活动仍然处于部分可见的状态。但更多时候意味着用户正在离开这个活动,并马上会进入停止状态。通常应该在的onPause()回调方法里面做以下事情:

  • 停止动画或者是其他正在运行的操作,那些都会导致CPU的浪费。
  • 提交在用户离开时期待保存的内容(例如邮件草稿)。
  • 释放系统资源,例如广播接收器,传感器(比如GPS),或者是其他任何会影响到电量的资源。

6。

当用户从暂停状态恢复活动时,系统会调用的onResume()方法。

请注意,系统每次调用这个方法时,活动都处于前台,包括第一次创建的时候。所以,应该实现的onResume()来初始化那些在的onPause方法里面释放掉的组件,并执行那些活动每次进入恢复状态都需要的初始化动作(例如开始动画与初始化那些只有在获取用户焦点时才需要的组件)

 

7.  因为系统在activity停止时会在内存中保存Activity的实例,所以有时不需要实现onStop(),onRestart()甚至是onStart()方法. 因为大多数的activity相对比较简单,activity会自己停止与重启,我们只需要使用onPause()来停止正在运行的动作并断开系统资源链接。

8.极端情况下,系统会直接杀死我们的app进程,并不执行activity的onDestroy()回调方法, 因此我们需要使用onStop()来释放资源,从而避免内存泄漏。

9.

通常,不应该使用onPause()来保存用户改变的数据 (例如填入表格中的个人信息) 到永久存储(File或者DB)上。仅仅当确认用户期待那些改变能够被自动保存的时候(例如正在撰写邮件草稿),才把那些数据存到永久存储 。但是,我们应该避免在onPause()时执行CPU-intensive 的工作,例如写数据到DB,因为它会导致切换到下一个activity变得缓慢(应该把那些heavy-load的工作放到onStop()

如果activity实际上是要被Stop,那么我们应该为了切换的顺畅而减少在OnPause()方法里面的工作量。

Note:当activity处于暂停状态,Activity

 10.

activity已经停止后,Activity对象会保存在内存中,并在activity resume时被重新调用。我们不需要在恢复到Resumed state状态前重新初始化那些被保存在内存中的组件。系统同样保存了每一个在布局中的视图的当前状态,如果用户在EditText组件中输入了text,它会被保存,因此不需要保存与恢复它。

Note: 即使系统会在activity stop时停止这个activity,它仍然会保存View对象的状态(比如EditText中的文字) 到一个Bundle中,并且在用户返回这个activity时恢复它们(下一小节会介绍在activity销毁与重新建立时如何使用Bundle

11.当activity从Stopped状态回到前台时,它会调用onRestart().系统再调用onStart()方法,onStart()方法会在每次activity可见时都会被调用。onRestart()方法则是只在activity从stopped状态恢复时才会被调用,因此我们可以使用它来执行一些特殊的恢复(restoration)工作,请注意之前是被stopped而不是destrory。

当系统Destory我们的activity,它会为activity调用onDestroy()方法。因为我们会在onStop方法里面做释放资源的操作,那么onDestory方法则是我们最后去清除那些可能导致内存泄漏的地方。因此需要确保那些线程都被destroyed并且所有的操作都被停止。

12. 你的Activity会在每次旋转屏幕时被destroyed与recreated。当屏幕改变方向时,系统会Destory与Recreate前台的activity,因为屏幕配置被改变,你的Activity可能需要加载另一些替代的资源(例如layout). 

13. 

默认情况下, 系统使用 Bundle 实例来保存每一个View(视图)对象中的信息(例如输入EditText 中的文本内容)。因此,如果Activity被destroyed与recreated, 则layout的状态信息会自动恢复到之前的状态。然而,activity也许存在更多你想要恢复的状态信息,例如记录用户Progress的成员变量(member variables)。

Note: 为了使Android系统能够恢复Activity中的View的状态,每个View都必须有一个唯一ID,由android:id定义。

为了可以保存额外更多的数据到saved instance state。在Activity的生命周期里面存在一个额外的回调函数,你必须重写这个函数。该回调函数并没有在前面课程的图片示例中显示。这个方法是onSaveInstanceState() ,当用户离开Activity时,系统会调用它。当系统调用这个函数时,系统会在Activity被异常Destory时传递 Bundle 对象,这样我们就可以增加额外的信息到Bundle中并保存到系统中。若系统在Activity被Destory之后想重新创建这个Activity实例时,之前的Bundle对象会(系统)被传递到你我们activity的onRestoreInstanceState()方法与 onCreate() 方法中。

基本的生命周期,saveState和

Figure 2. 当系统开始停止Activity时,只有在Activity实例会需要重新创建的情况下才会调用到onSaveInstanceState() (1) ,在这个方法里面可以指定额外的状态数据到Bunde中。如果这个Activity被destroyed然后这个实例又需要被重新创建时,系统会传递在 (1) 中的状态数据到 onCreate() (2) 与 onRestoreInstanceState()(3).

(通常来说,跳转到其他的activity或者是点击Home都会导致当前的activity执行onSaveInstanceState,因为这种情况下的activity都是有可能会被destory并且是需要保存状态以便后续恢复使用的,而从跳转的activity点击back回到前一个activity,那么跳转前的activity是执行退栈的操作,所以这种情况下是不会执行onSaveInstanceState的,因为这个activity不可能存在需要重建的操作)

14.

当我们的activity开始Stop,系统会调用 onSaveInstanceState() ,Activity可以用键值对的集合来保存状态信息。这个方法会默认保存Activity视图的状态信息,如在 EditText 组件中的文本或 ListView 的滑动位置。

为了给Activity保存额外的状态信息,你必须实现onSaveInstanceState() 并增加key-value pairs到 Bundle 对象中,例如:

static final String STATE_SCORE = "playerScore";
static final String STATE_LEVEL = "playerLevel";
...

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    // Save the user's current game state
    savedInstanceState.putInt(STATE_SCORE, mCurrentScore);
    savedInstanceState.putInt(STATE_LEVEL, mCurrentLevel);

    // Always call the superclass so it can save the view hierarchy state
    super.onSaveInstanceState(savedInstanceState);
}

 

当Activity从Destory中重建,我们可以从系统传递的Activity的Bundle中恢复保存的状态。 onCreate() 与 onRestoreInstanceState() 回调方法都接收到了同样的Bundle,里面包含了同样的实例状态信息。

由于onCreate()方法会在第一次创建新的活动实例与重新创建之前被Destory的实例时都被调用,我们必须在尝试读取Bundle对象前检测它是否为null。如果它为null,系统则是创建一个新的活动实例,而不是恢复之前被Destory的活性的影响。

下面是一个示例:演示在的onCreate方法里面恢复一些数据:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState); // Always call the superclass first

    // Check whether we're recreating a previously destroyed instance
    if (savedInstanceState != null) {
        // Restore value of members from saved state
        mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
        mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
    } else {
        // Probably initialize members with default values for a new instance
    }
    ...
}

我们也可以选择实现onRestoreInstanceState(),而不是在onCreate方法里面恢复数据  。onRestoreInstanceState()方法会在onStart()方法之后执行。系统仅仅会在存在需要恢复的状态信息时才会调用onRestoreInstanceState(),因此不需要检查Bundle是否为null。

public void onRestoreInstanceState(Bundle savedInstanceState) {
    // Always call the superclass so it can restore the view hierarchy
    super.onRestoreInstanceState(savedInstanceState);

    // Restore state members from saved instance
    mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
    mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
}

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值