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

2018-09-19  本文已影响0人  crush_d872

一、生命周期

生命周期

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);

上一篇下一篇

猜你喜欢

热点阅读