Android的生命周期

Android的生命周期

正常情况下的生命周期

Activity生命周期的切换过程

Activity 生命周期

  1. onCreate:首次创建Activity时调用,表示Activity正在被创建。您应该在此方法中执行所有正常的静态设置(初始化工作)——创建视图(setContenView去加载界面布局资源)、将数据绑定到列表等等。 系统向此方法传递一个 Bundle 对象,其中包含Activity的上一状态,不过前提是捕获了该状态(系统会在异常情况下销毁您的 Activity,在此前调用onSaveInstanceState())

  2. onRestart:在Activity已停止并即将再次启动前调用,表示正在重新启动,始终后接onStart()。当当前Activity从不可见重新变成可见状态,就会调用此方法。

  3. onStart:在Activity即将对用户可见之前调用,表示Activity正在被启动,此时Activity已经可见,但是未出现在前台,无法与用户交互。

  4. onResume:在Activity即将开始与用户进行交互之前调用。 此时,Activity 处于Activity堆栈的顶层,并具有用户输入焦点。

  5. onPause:当系统即将开始继续另一个Activity 时调用,表示Activity正在停止。此方法通常用于确认对持久性数据的未保存更改、停止动画以及其他可能消耗CPU的内容,诸如此类。它应该非常迅速地执行所需操作,不能太耗时,因为它返回后,下一个 Activity 才能继续执行。

  6. onStop:在Activity对用户不再可见时调用,表示Activity即将停止。如果Activity被销毁,或另一个Activity(一个现有Activity或新Activity)继续执行并将其覆盖,就可能发生这种情况。

  7. onDestroy:在Activity被销毁前调用,表示Activity即将被销毁。这是Activity将收到的最后调用,可以做一些回收工作和资源的释放。当Activity结束(有人对Activity调用了finish()),或系统为节省空间而暂时销毁该Activity实例时,可能会调用它。您可以通过isFinishing()方法区分这两种情形。

Activity 的整个生命周期发生在 onCreate() 调用与 onDestroy() 调用之间。您的 Activity 应在 onCreate()中执行“全局”状态设置(例如定义布局),并释放 onDestroy() 中的所有其余资源。例如,如果您的 Activity 有一个在后台运行的线程,用于从网络上下载数据,它可能会在 onCreate() 中创建该线程,然后在 onDestroy() 中停止该线程。

Activity 的可见生命周期发生在 onStart() 调用与 onStop()调用之间。在这段时间,用户可以在屏幕上看到 Activity 并与其交互。 例如,当一个新 Activity 启动,并且此 Activity 不再可见时,系统会调用 onStop()。您可以在调用这两个方法之间保留向用户显示 Activity 所需的资源。 例如,您可以在 onStart() 中注册一个 BroadcastReceiver 以监控影响 UI 的变化,并在用户无法再看到您显示的内容时在 onStop() 中将其取消注册。在 Activity 的整个生命周期,当 Activity 在对用户可见和隐藏两种状态中交替变化时,系统可能会多次调用 onStart() 和 onStop()。

Activity 的前台生命周期发生在 onResume() 调用与 onPause() 调用之间。在这段时间,Activity 位于屏幕上的所有其他 Activity 之前,并具有用户输入焦点。 Activity 可频繁转入和转出前台 — 例如,当设备转入休眠状态或出现对话框时,系统会调用 onPause()。 由于此状态可能经常发生转变,因此这两个方法中应采用适度轻量级的代码,以避免因转变速度慢而让用户等待。

一些情况:

1:启动MainActivity后按back退出
image

2:启MainActivity后按home键或者任务键或者锁屏
image

之后再回到MainActivity
image

最后退出
image

(通过后台任务移除应用,有时出现onDestroy不执行)

3:启动MainActivity后启动SecondActivity
image
(如果您必须在第一个Activity停止时向数据库写入数据,以便下一个Activity能够读取该数据,则应在onPause()而不是onStop()执行期间向数据库写入数据。)

按back键返回到MainActivity
image

4:当SecondActivity透明主题或者Dialog主题时

<activity android:name=".SecondActivity"
android:theme="@android:style/Theme.Translucent.NoTitleBar">
</activity>
<activity android:name=".SecondActivity"
android:theme="@android:style/Theme.Dialog">
</activity>

启动MainActivity后启动SecondActivity,MainActivity不执行onStop,因为在屏幕还可见。
image

这边按home键或者锁屏或者任务键后,MainActivity 会执行onstop,然后回到SecondActivity,具体见图,在我的测试机上,按完锁屏不懂为什么不执行onSaveInstanceState()
image

之后再按back返回到MainActivity,MainActivity不执行onRestart和onStart
image

异常情况下的生命周期

image

无法保证系统会在销毁您的Activity前调用 onSaveInstanceState(),因为存在不需要保存状态的情况(例如用户使用“返回”按钮离开您的 Activity时,因为用户的行为是在显式关闭 Activity)。如果系统调用onSaveInstanceState(),它会在调用onStop()之前,并且可能会在调用 onPause()之前进行调用。调用 onRestoreInstanceState()是在onStart()之后。(注:当Activity变成后台Activity,执行onStop之前–用户按home键或者启动新的Activity或者锁屏或者调任务键仍然会单独触发onSaveInstanceState())

系统调用 onSaveInstanceState(),然后再使 Activity 变得易于销毁。系统会向该方法传递一个 Bundle,您可以在其中使用 putString() 和 putInt() 等方法以名称-值对形式保存有关 Activity 状态的信息。然后,如果系统终止您的应用进程,并且用户返回您的 Activity,则系统会重建该 Activity,并将 Bundle 同时传递给 onCreate() 和 onRestoreInstanceState()。您可以使用上述任一方法从 Bundle提取您保存的状态并恢复该 Activity 状态。如果没有状态信息需要恢复,则传递给您的Bundle是空值(如果是首次创建该 Activity,就会出现这种情况)。

1. 资源相关的系统配置发生改变导致Activity被杀死并重新创建(例如屏幕方向、键盘可用性及语言)

 发生这种变化时,Android会重启正在运行的 Activity(先后调用onDestroy()和onCreate())。重启行为旨在通过利用与新设备配置匹配的备用资源自动重新加载您的应用,来帮助它适应新配置。

如屏幕方向改变
image

2. 资源不足导致低优先级的Activity被杀死

Activity优先级从高到低:
1. 前台Activity–执行到了onResume
2. 可见但并非前台–执行到了onPause
3. 后台Activity–执行到了onStop

重启应用并恢复大量数据不仅成本高昂,而且给用户留下糟糕的使用体验。在这种情况下,您有两个其他选择:
  1. 在配置变更期间保留对象: 允许 Activity 在配置变更时重启,但是要将有状态对象传递给 Activity 的新实例。
  2. 自行处理配置变更: 阻止系统在某些配置变更期间重启Activity,但要在配置确实发生变化时接收回调,这样,您就能够根据需要手动更新 Activity。

具体官方链接:处理运行时变更

相关代码

public class MainActivity extends Activity {
    private static final String TAG = "MainActivity";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.i(TAG,"onCreate");
        //startActivity(new Intent(MainActivity.this,SecondActivity.class));
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        Log.i(TAG,"onRestart");
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.i(TAG,"onStart");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.i(TAG,"onResume");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.i(TAG,"onPause");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.i(TAG,"onStop");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.i(TAG,"onDestroy");
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        Log.i(TAG,"onSaveInstanceState");
    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        Log.i(TAG,"onRestoreInstanceState");
    }
}
public class SecondActivity extends Activity{
    private static final String TAG = "SecondActivity";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        Log.i(TAG,"onCreate");
    }
    @Override
    protected void onRestart() {
        super.onRestart();
        Log.i(TAG,"onRestart");
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.i(TAG,"onStart");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.i(TAG,"onResume");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.i(TAG,"onPause");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.i(TAG,"onStop");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.i(TAG,"onDestroy");
    }
    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        Log.i(TAG,"onSaveInstanceState");
    }
    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        Log.i(TAG,"onRestoreInstanceState");
    }
}

参考:官方文档应用组件:Activity

Android开发艺术探索

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值