安卓Activity

来源:互联网 发布:淘宝接收不到卖家消息 编辑:程序博客网 时间:2024/04/28 09:31

安卓Activty生命周期如下:

1、onCreate与onDestroy对应为一对,是entire lifetime,对应资源分配与销毁。比如按Back按键,则Activity会调用finish()(finish函数调用了onDestroy),资源会被销毁。当通过Intent由界面A到界面B时,也会把界面A资源销毁。

2、onStart与onStop对应为一对,是visible lifetime,对应为可见与不可见。比如按下Home按键,则会加载Home界面显示于当前Activity之上;此时安卓系统操作是将Home界面入栈,置于栈顶(即处于running状态),而Activity则被调用了onPause和onStop处于不可见状态。

3、onResume和onPause对应为一对,是foreground lifetime,对应为是否处于激活状态,即Activity栈的栈顶。比如Activity B位于Activity A之上,但Activity B未完全遮盖住Activity A或者Activity B为透明的,则Activity A仍然是可见的,但此时并非激活状态。从Activity A转换到Activity B过程中,Activity A只是调用了onPause。

安卓系统使用Activity Stack来管理多个Activity,同一时刻只有一个Activity处于栈顶,即处于active或running状态。但是可以有多个Activity处于可见状态,此时这些可见但非active状态的Activity处于pause状态。

系统在内存不足时,会清除一些Activity:被清除优先级依次为empty process>background activity>service progress>visible activity>foreground activity

empty process:无任何Activity或Service与之绑定,仅仅作为cache缓存;

background activity:即被onStop的Activity,此时处于不可见状态;

service progress:绑定了service的Activity进程;

visible activity:被onPause的Activity,可见但非active;

foreground activity:栈顶的Activity


实验:操作1、Home按键;2、Back按键;3、Activity切换;4、切屏

重写函数:

    protected void onStart(){
       Log.v(MainActivity.ACTIVITY_SERVICE,"onStart");    
       super.onStart();
    }

    protected void onResume(){
           Log.v(MainActivity.ACTIVITY_SERVICE,"onResume");    
           super.onResume();
    }
    
    protected void onPause(){
           Log.v(MainActivity.ACTIVITY_SERVICE,"onPause");    
           super.onPause();
    }
    
    protected void onStop(){
           Log.v(MainActivity.ACTIVITY_SERVICE,"onStop");    
           super.onStop();
    }
    
    protected void onDestroy(){
           Log.v(MainActivity.ACTIVITY_SERVICE,"onDestroy");    
           super.onDestroy();
    }

1、Home按键:

onPause

onStop

说明系统仅仅采取入栈操作,将主界面入栈,使其位于栈顶;

再次运行应用程序,

onStart

onResume

2、Back按键:

onPause

onStop

onDestroy

说明系统将Activity出栈,其资源被销毁(finish()被运行)

再次运行应用程序

onCreate

onStart

onResume

Activity重新被系统创建启动;可以采用方法使Activity不对Back按键响应,即不运行finish()

3、Activity切换

onPause

onStop

系统将新界面入栈,按Back按键,新界面销毁,原界面显示

onStart

onResume

若设置新界面为透明的,则会只运行onPause。

4、切屏

a、不设置Activity的android:configChanges时

按f12切横屏
onPause
onStop
onDestroy
onCreate
onStart
onResume

表明重新调用一次生命周期

按f12切竖屏
onPause
onStop
onDestroy
onCreate
onStart
onResume
onSaveInstanceState
onPause
onStop
onDestroy
onCreate
onStart
onResume

表明经历两次生命周期

b、设置Activity的android:configChanges="orientation"时

切横屏,调用一次生命周期

onPause
onStop
onDestroy
onCreate
onStart
onResume

切竖屏,调用一次生命周期

onPause
onStop
onDestroy
onCreate
onStart
onResume

实际调用了onConfigChanged函数,可以重载之

c、设置Activity的android:configChanges="orientation|keyboardHidden"时,

切横屏,不调用生命周期,只调用onConfigChanged了函数一次

onConfigChanged

切竖屏,不调用生命周期,只调用onConfigChanged了函数两次次

onConfigChanged

onConfigChanged


当系统启动另外一个新的Activity时,在新Activity启动之前被系统调用保存现有的Activity中的持久数据、停止动画等,这个实现方法必须非常快。当系统而不是用户自己出于回收内存时,关闭了activity 之后。用户会期望当他再次回到这个activity 的时候,它仍保持着上次离开时的样子。此时用到了onSaveInstanceState(),方法onSaveInstanceState()用来保存Activity被杀之前的状态,在onPause()之前被触发,当系统为了节省内存销毁了Activity(用户本不想销毁)时就需要重写这个方法了,当此Activity再次被实例化时会通过onCreate(Bundle savedInstanceState)将已经保存的临时状态数据传入因为onSaveInstanceState()方法不总是被调用,触发条件为(按下HOME键,按下电源按键关闭屏幕,横竖屏切换情况下),你应该仅重写onSaveInstanceState()来记录activity的临时状态,而不是持久的数据。应该使用onPause()来存储持久数据。


原创粉丝点击