android-activity详解

一、activity的生命周期
1>正常情况下的生命周期
2>异常情况下的生命周期

(1)正常情况下的生命周期:
onCreate——>onStart——>onResume—–>onPause——>onstop—–onDestory
onrestart。
注意:两个activity切换执行的顺序为,第一个先onPause,第二个activity才开始onCreate.

(2)异常情况下的生命周期:1:系统配置发生改变,2,:内存不足低优先级被杀死。

1:系统配置发生改变,activity被杀死并重建(场景:竖屏变为横屏)
    activity----->onSaveInstanceState----->onDestory
    activity----->onCreate----->onRestoreInstanceState
 系统配置发生改变,系统会调用activity的onSaveInstanceState方法,将需要的参数保存在参数
  bundle中,这个bundle会作为参数传递给activity再次创建时的onCreate和onRestoreInstanceState
  保证我们的activity正常运行切换横竖屏,onSaveInstanceState执行在onstop之前,onRestoreInstanceState
  执行在onStart之前,

onSaveInstanceState和onRestoreInstanceState系统为我们做了很多的恢复工作,比如空间的数据等,查看view
相关的系统源码发现,view中也有onSaveInstanceState和onRestoreInstanceState,用来自我恢复,根据Android
系统的源码分析得知,系统所执行的操作为,activity调用onSaveInstanceState等方法,这个时候activty
会委托window保存数据,window再委托它的顶级容器去保存数据,顶级容器一般为viewGroup(DecorView),最后
顶级容器再一一通知他的子元素来保存数据。 等取数据的时候一个这个顺序,这种委托思想在android中很多应用。
public class SaveActivity extends Activity{
        @override
        protected void onCreate(Bundle saveInstanceState){
            super.onCreate(saveInstanceState);
            setContentView(R.layout.main);
            if(saveInstanceState != null){
                String test = saveInstanceState.getString("tian");
            }
        }

        @override
        protected void onSaveInstanceState(Bundle outState){
            super.onSaveInstanceState(outState);
            outState.putString("tian","songtao");
        }

        @override
        protected void onRestoreInstanceState(Bundle savedInstanceState){
            super.onRestoreInstanceState(savedInstanceState);
            String test = savedInstanceState.getString("tian");
        }
    }

    当系统配置改变时我们想办法不重建activity:
        activity在AndroidMenifest.xml中有配置可以不重建activity
            android:configChanges="orientation"多个选项用|隔开
        eg:<activity
                android:name="mainActivity"
                android:configChanges="orientation|screenSize"></activity>
         @override
         public void onConfigurationChanged(Configuration newConfig){
             super.onConfigurationChanged(newConfig);
             Log.d(TAG," newOrientation : " + newConfig.orientation);
         }

由上可以看出,activity这个配置,当屏幕横竖屏发生改变时activity就不会重建。
就会调用onConfigurationChanged方法,在这个方法里我们可以进行操作。

 activity有很多配置,这个可以网上查:但常用的系统配置:
 1:android:configChanges="locale" 系统位置发生改变,一般指切换了系统语言
 2:android:configChanges="orientation | screenSize"系统屏幕方法改变
 3:android:configChandes="keyboardHidden" 系统键盘是否可用,也就是说键盘是否弹出。

2:资源内存不足导致低优先级activity被杀死:
注意:这种情况和情况1的数据保存恢复完全一致。
activity的优先级描述:
1>前台activity,与用户交互,优先级最高
2>可见非前台activity,比如dialog对话框出来时,activity可见但无法交互
3>后台activity,已经被暂停,执行stop方法,
当系统内存不足时会按照优先级杀死目标activity所在的进程。

二、activity的启动模式:standard,singleTop,SingleTask,SingleInstance.

    1:standard:标准模式,也是系统默认的模式,每次启动一个activity都会创建一个新的实例,
        并执行它全部的生命周期。这个必须时activity启动另一个activity,因为activity中的
        context会告诉下一个activity启动位于那个栈。
    2:singleTop:栈顶复用模式:若activity位于栈顶,则activity不会重新创建,但会执行
        onNewIntent方法,
    3:singleTask:栈内复用模式:这是一种单利模式,若activity在这个栈内存在,那么activity
        就不会被重新创建,但会回调onNewIntent
    4:singleInstance:单实例模式:一种加强的singleTask,它具有singleTask全部特性,但activity
        只能单独位于一个任务栈中,例如,A是singleInstance模式,系统启动它就会为A创建一个单独
        的任务栈,A单独在这个新的任务栈中,由后期单独复用,不会在从新被创建。

eg: activity启动模式指定
     1:<activity 
        android:name="com.tian.MainActivity"
        android:taskAffinity="com.tian.song"
        android:launchMode="singleTask"></activity>
     2:Intent intent = new Intent();
       intent.setClass(mainActivity.this,mainActivity.class);
       intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
       startActivity(intent);

     TaskAffinity:任务栈相关性,这个属性可以确定activity位于那个任务栈中,常与singleTask一起用。

    eg:这里有三个activity,A、B、C , 
        A:launchMode(standard),Main
        BC:launchMode(SingleTask)  taskAffinity("com.tian.song")
     启动应用程序,这里从ApplicationContext中启动A,创建一个任务栈1A创建实例进入任务栈1A
        启动activity-B,因为规定了singleTask,taskAffinity参数,则从新创建一个任务栈2,这个任务
        栈为com.tian.song, B创建实例并进入了栈2,B启动C,因为SingleTask,taskAffinity参数和B一致,
        则C会创建一个实例,进入任务栈2,以为taskAffinity参数一致,C再启动A,这时,以为A是从C启动的。
        上下文为C的context,A的启动模式为standard,则A创建实例,进入任务栈2,这时再启动B则因为B已经
        存在与栈2,由因为栈内顺序为BCA,根据数据栈的结构,要想显示B,则CA必须先出栈,所以这时B显示了
        但栈2内就只剩下了B-activity,这时按两下back键,第一次返回的是任务栈1中的A,再一次返回,显示
        的就是桌面了,这就是利用singTask和TaskAffinity控制的activity顺序。

猜你喜欢

转载自blog.csdn.net/tst116/article/details/71076063