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

一、生命周期


生命周期

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容