美文网首页
android四大组件----Activity(一)

android四大组件----Activity(一)

作者: crush_d872 | 来源:发表于2018-09-19 13:01 被阅读0次

    一、生命周期

    生命周期

    onCreate():当activity被创建时调用,在这里主要做一些初始化的操作,如设置布局、初始化视图、绑定控件等等。

    onStart():当用户变成用户可见时调用,此时的activity还不可见。举个例子说明一下这个函数的意义,当你按下home键直接返回了主页面,再进入这个activity时,会先调用onRestart()函数,再调用它,而不会去调用onCreate()函数了。这个函数一般是注册一些变量,这些变量只有activity类在前台时才能被响应.

    onResume():activity获取焦点时调用,此时activity返回栈顶,并处于运行状态。这里一般可以做一些刷新UI的操作,每当activity调用到这里时就刷新一下控件。

    Activity失去了焦点:这个很多人不理解,这个失去焦点的意思就是用户不能对activity操作了,比如我们弹出来一个广告或者升级提示,这时activity我们就不能操作了,但是依旧能看见,当再次关闭这个弹窗时,又获取了焦点,就再次执行onResume()方法。

    onPause():说明白了失去焦点的原因,这个函数就很容易理解了。这个函数主要是界面失去了焦点,通常在这个函数中是对一些变量做操作,会释放一些占CPU资源,或者保存一些关键的数据.官方解释:

        (1)当activity进入后台并且该Activity并未销毁时,该方法会被调用

        (2)在Activity A中启动Activity B,如果B的活动页面覆盖在了A上面,那么Activity A则会调用onPause().

        (3)onPause()方法对应的方法是onResume,如果一个Activity调用了onPause()不活动状态时,那么当Activity进入活动状态的时候必定会调用onResume().

    onStop():界面不可见,在activity完全不可见时调用.官方解释:

        (1)当前的Activity不再呈现给用户的时候,onStop()被调用。

        (2)如果onStop()方法被调用之后,那么该Activity就处于挂起状态。那么在此时的情况下,要么唤醒它(onRestart()),要么销毁它(onDestroy())。

        (3)在某些情况下,该方法可能不会被调用。比如系统内存过低导致无法确保在onPause()方法在被调用之后该Activity继续保持着运行状态。

    onDestroy():activity销毁

    onRestart():当用户按Home键返回桌面,并重新进入activity时被调用。

    生命周期这一块用几个例子加深一下理解:

    (1)Activity A启动了Activity B的时候,Activity A和Activity B的生命周期的运行的方法排序是什么?

       正常状态: onPause(A) -> onCreate(B) -> onStart(B) -> onResume(B) -> onStop(A)

        Dialog:onPause(A) -> onCreate(B) -> onStart(B) -> onResume(B)

    (2)当处于Activity B时,点击返回键回到Activity A时,Activity A 和 Activity B的生命周期的运行的方法排序是什么?

        正常状态:onPause(B) -> onRestart(A) -> onStart(A) -> onResume(A) -> onStop(B) -> onDestroy(B)

        Dialog:onPause(B) -> onResume(A) -> onStop(B) -> onDestroy(B)

    (3)当处于Activity B时,按下锁屏按钮,Activity A和Activity B的生命周期方法排序是什么?

        正常状态:onPause(B) -> onStop(B),重新唤醒时:onRestart(B) -> onStart(B) -> onResume(B)

        Dialog:onPause(B) -> onStop(B) -> onStop(A),重新唤醒时:onRestart(B) -> onStart(B) -> onRestart(A) -> onStart(A) ->         onResume(B)

    (4)如果设置Activity B的主题为Dialog风格的话,那么(1)(2)(3)的结果分别是什么?

    二、启动模式

        standard:默认模式,可以不用写配置。在这个模式下,都会默认创建一个新的实例。因此,在这种模式下,可以有多个相同的实例,也允许多个相同的Activity叠加。

        singletask:开启一个ActivityB的时候检查任务栈里面是否有这个ActivityB的实例存在,如果存在的话,清空这个任务栈ActivityB上面的所有的Activity,复用这个ActivityB。

        singletop:如果发现任务栈的栈顶已经存在这个Activity,再去开启Activity的时候,就不去重新创建新的Activity而是复用这个栈顶已经存在的Activity。

    singleinstance:开启一个新的任务栈,任务栈里面只有一个Activity的实例存在,如果这个Activity被开启,把这个任务栈放在前面,如果开启了新的别的Activity,则别的Activity所在的任务栈会被放在前面。极端的说,在整个手机的操作系统里面只会有一个实例存在。

    三、创建流程

        (1)自定义类名,继承Activity类(Activity和AppCompatActivity二选一,后者提供了一些新的东西).

        (2)重写onCreate()方法,在该方法中调setContentView()设置要显示的视图.

        (3)在AndroidManifest.xml对Activity进行配置

        注意:onCreate()方法中的函数,可以填两个参数一个是Bundle savedInstanceState,另一个是PersistableBundle persistableState,如果要用第二个函数要在配置文件中为Activity设置一个属性:

                android:persistableMode="persistAcrossReboots"

    然后Activity就有了持久化的能力,一般会搭配两个方法使用:

    public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState)public void onRestoreInstanceState(Bundle savedInstanceState, PersistableBundle persistentState);

    前一个方法会在下述情形中被调用:

    1.点击home键回到主页或长按后选择运行其他程序

    2.按下电源键关闭屏幕

    3.启动新的Activity

    4.横竖屏切换时,肯定会执行,因为横竖屏切换的时候会先销毁Act,然后再重新创建 重要原则:当系统"未经你许可"时销毁了你的activity,则onSaveInstanceState会被系统调用, 这是系统的责任,因为它必须要提供一个机会让你保存你的数据(你可以保存也可以不保存)。

    说回这个Activity拥有了持久化的能力,增加的这个PersistableBundle参数令这些方法 拥有了系统关机后重启的数据恢复能力!!而且不影响我们其他的序列化操作

    四、启动一个Activity的几种方式

    1.显式启动

        (1)最常用的

                startActivity(new Intent(当前Act.this,要启动的Act.class));

         (2)通过Intent的ComponentName:

                ComponentName cn = new ComponentName("当前Act的全限定类名","启动Act的全限定类名") ;

                Intent intent = new Intent() ;

                intent.setComponent(cn) ;

                startActivity(intent) ;

        (3)初始化Intent时指定包名

                Intent intent = new Intent("android.intent.action.MAIN");

                intent.setClassName("当前Act的全限定类名","启动Act的全限定类名");

                startActivity(intent);

    相关文章

      网友评论

          本文标题:android四大组件----Activity(一)

          本文链接:https://www.haomeiwen.com/subject/idvbnftx.html