频道栏目
首页 > 程序开发 > 移动开发 > Android > 正文
Android成长之路(3)——Activity的生命周期(1)
2016-04-25 09:39:44         来源:一个热爱编程的少年  
收藏   我要投稿

当用户在用一个App的时候,Activity会在生命周期不同的状态下转换。

当用户离开或重新回到一个Activity,我们可以在生命周期的回调函数中来写一些相关的操作。比如,如果用户打开了一个视频播放器,当他直接切换到另外一个App,这时候应该使播放器暂停,断开获取视频资源的网络连接。当用户回来,我们要重新连接网络获取视频资源,让用户在刚才暂停的位置开始重新观看。

接下来,开始去了解非常重要的生命周期的回调函数,学着怎么去用它们来执行一些使用户有更好体验的操作,并且当我们不需要它们时,不要消耗系统的资源。在Android系统中,不是跟其他程序一样会启动一个main()方法, 而是通过调用对应生命周期特定状态的回调函数,来开始一个Activity实例.

启动一个Activity

在一个Activity的生命周期中,其中的回调函数可以看成一个阶梯金字塔。也就是,每一个Activity生命周期的阶段就是金字塔上的一个台阶。当系统开始启动一个Activity时,其中的回调函数会让Activity一个台阶一个台阶地登上最高的那一台阶。在最高的那一层台阶,运行时Activity可以完全显示出来,和用户进行交互。

当用户退出当前的Activity,系统会调用其它的方法,让Activity从最高那层台阶往下走,它就不会在前台了。有些时候,它只是从金字塔往下走了一部分,然后在那等着(比如说用户切换到其它的App)。这个时候这个Activity还是可以往上走回到金字塔最高那一层(用户又回到了之前的Activity),用户继续在刚才离开的地方进行操作。

这里写图片描述vcbky/y1xEFwcKOssrvSqs/6u9m1scewtcRBcHA8YnIgLz4NCjKhorWx08O7p8O709DTw7W9z7XNs7XE18rUtKOs0qq52LX0o6yyu9Kqz/u6xM+1zbPXytS0PGJyIC8+DQozoaK1sdPDu6fA67+qQXBw0ru74brz1Nm1vUFwcKOssrvSqraqyqfTw7untcS9+LbIPGJyIC8+DQo0oaK1scbBxLvU2rrhz/K6zdfdz/LWrrzk0P3Xqsqxo6yyu9KqyqfIpdPDu6e1xL34tsihozwvcD4NCjxwPkFjdGl2aXR51Nqyu82stcS917bO16q7u8qxo6zI58nPzbyhozxiciAvPg0KtavKx6Os1rvT0Mj9uPa917bOyse+ssystcSho0FjdGl2aXR51ru74dTa1eLI/bj2vde2zsbk1tDSu7j2vde2zsnPs6TKsbzkzaPB9KO6PC9wPg0KPHA+PHN0cm9uZz5SZXN1bWVkPC9zdHJvbmc+PGJyIC8+DQrU2tXi0ru917bOo6xBY3Rpdml0ebvhz9TKvtTax7DMqMnPo6y6zdPDu6e9+NDQvbu7paGj0rK+zcrH1MvQ0LXEvde2zqGjPGJyIC8+DQo8c3Ryb25nPlBhdXNlZDwvc3Ryb25nPjxiciAvPg0K1NrV4rj2vde2zqOsQWN0aXZpdHm74bG7xuTL+7XEQWN0aXZpdHmyv7fWtdjV2rjH16GjrNXiyrG68rXEQWN0aXZpdHmyu8TcvdPK1dPDu6e1xMrkyOvSsrK7xNzWtNDQyM66zrT6wuuhozxiciAvPg0KPHN0cm9uZz5TdG9wcGVkPC9zdHJvbmc+PGJyIC8+DQq1sUFjdGl2aXR51NpTdG9wcGVkvde2zqOsu+HN6sirsbvR2rjH16GjrNPDu6eyu7/JvPuho9Xiyse1xEFjdGl2aXR5yrXA/brNy/u1xNK70KmzydSxseTBv8jUyLuxo8H0o6y1q8v8sru74da00NDIzrrOtPrC68HLoaM8L3A+DQo8cD62+NTaxuTL+7XEvde2ziAoQ3JlYXRlZCC6zSBTdGFydGVkKSC2vMrH0rvLsrzktcSjrCDPtc2zu+G199PDz8LSu7j2yfrD/Nbcxtq1xLqvyv2jrLrcv+y12Mz4tb3PwtK7uPa917bOoaPL+dLU1NrPtc2ztffTwyBvbkNyZWF0ZSgp1q6686Osy/y63L/svs274bX308NvblN0YXJ0KKOpvdPXxcLtyc+4+tfFIG9uUmVzdW1lKCmhozwvcD4NCjxwPjxzdHJvbmc+1ri2qEFwcLXExvS2r0FjdGl2aXR5PC9zdHJvbmc+PC9wPg0KPHA+1NpBbmRyb2lkTWFuaWZlc3QueG1s1tCjrL/J0tTWuLaoxMTSu7j2QWN0aXZpdHnTw9f3bWFpbiBBY3Rpdml0eaGj1eK49m1haW4gQWN0aXZpdHnSqtTaJmx0OyBpbnRlbnQtZmlsdGVyICZndDvW0Mn5w/ejrLD8uqxNQUlOIGFjdGlvbiC6zSBMQVVOQ0hFUiBjYXRlZ29yeS48YnIgLz4NCsD9yOc6PC9wPg0KPHByZSBjbGFzcz0="brush:java;">

OnCreate

大部分的App都会有几个不同的Activity,当用户点击打开App时,系统会通过调用onCreate()方法来创建每个新的Activity。
必须要实现 onCreate()方法来执行一些活动的UI、数据等加载,这在整个生命周期只执行一次。例如在XML中定义用户界面口,定义成员变量,配置一些UI。

上一次DisplayActivity中的代码:

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_display_message);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        Intent intent = getIntent();
        String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);
        TextView textView = new TextView(this);
        textView.setTextSize(40);
        textView.setText(message);

        RelativeLayout layout = (RelativeLayout) findViewById(R.id.content);
        layout.addView(textView);

    }

一旦 onCreate()执行完成, 系统就会紧接着调用 onStart() 和 onResume() 方法. Activity不会停留在Created和Started这两个阶段。其实,当onStart()方法被调用的时候,用户已经可以看见Activity,只不过onResume()会马上被调用,Activity就进入在Resumed这一状态,直到用户切换到另一个App或者有来电了,又或者关闭了屏幕。

这里写图片描述

当创建一个新的Activity实例时,重点关注这三个回调方法 :onCreate(), onStart(), 和 onResume()。一旦回调方法执行完成,Activity就会到Resumed这一阶段,即Activity回到前台,用户就可以和这个Activity进行交互。

onDestroy

onCreate()在生命周期中是第一个执行的方法,而onDestroy()是生命周期中最后一个执行的方法. 系统在Activity中调用onDestroy()这个方法作为结束的信号,Activity实例会从系统内存中移除。

大部分App都不需要实现这个方法,因为Activity调用onDestroy()前,应该在onPause() 和onStop()这两个方法中执行清除内存操作。但是如果Activity中有线程是在onCreate()中或者一些长期运行的资源,如果不合适地关掉的话,会造成内存泄漏!这是时候应该在最后的onDestroy()方法中关掉它们。

@Override
public void onDestroy() {
    super.onDestroy(); 
}

系统在调用onPause()和onStop()方法之后,就会调用onDestroy()用。
除了一种情况:就是在onCreate()中调用finish()方法。
有时候,比如Activity执行一个临时的决策来启动另一Activity,就会在onCreate()中调用finish()方法。这种情况,系统会马上调用onDestroy()方法,不会再经过生命周期的其他回调方法。

OnPause()和onResume()

在用户使用app时,前台Activity有时被其他组件遮住,会导致Activity暂停。例如,当一个提示对话框打开,Activity就会暂停。虽然仍可以看见部分的Activity,但是Activity已经暂停,不会执行任何操作。如果Activity一旦完全被遮盖着看不见,它就停止了。会进入Stopped这一状态。

当Activity进入Paused状态,系统会在Activity中调用onPause(),比如会暂停视频,或者暂时保存 一些信息。当用户从Paused状态返回到当前的Activity,系统就会调用onResume()方法,重新回到Resumed状态。
这里写图片描述

当系统调用onPause(),Activity部分可见。但大多数的情况是,用户会离开当前的Activity,就会进入Stopped状态,最后执行onDestroy()方法。所以呢,在onPause()中会做一下几点:

1、停止会消耗CPU的动画或者正在运行的操作。
2、提交未保存的修改,比如草稿邮件/3、释放系统资源,比如广播接收器,GPS,或者当Activity暂停,而用户又不需要用到的资源

例如,App用到相机,那么onPause()方法是一个非常合适的地方来释放它

@Override
public void onPause() {
    super.onPause();  //首先调用父类的方法

    // 释放资源,因为其他的Activity可能需要用到它
    if (mCamera != null) {
        mCamera.release();
        mCamera = null;
    }
}

注意,不要在onPause()方法中执行数据库的操作,因为这会使跳转到下一个Activity很缓慢。
在onPause()执行一些相对简单的操作,以致于可以快速地跳转到下一个Activity。当Activity停止,这时候Activity实例会放在内存中,当Activity恢复时,就会重新调用这个实例,不需要再重新创建一个Activity实例。

需要知道的是,每一次系统调用onResume()方法,Activity就会回到前台,其中也包括了第一次创建实例的时候。

应该在onResume()方法中初始化一些在onPause()被释放掉的组件,还有每次恢复所需要的组件,比如一些开始的动画和需要的组件。

以下onResume()对应上面onPause()的例子,初始化在Pasued状态被释放掉的相机。

@Override
public void onResume() {
    super.onResume();  

    if (mCamera == null) {
        initializeCamera(); // 初始化相机的操作
    }
}
点击复制链接 与好友分享!回本站首页
相关TAG标签 之路 周期 生命
上一篇:Android 视图,控件,组件概念
下一篇:DragonBoard410c手把手进行安卓开发
相关文章
图文推荐
点击排行

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站