Android中的Activity
1.Activity的生命周期
onCreate 创建 onStart 可见 onResume 可编辑/有焦点
onDestroy 销毁 onStope 不可见 onPause 不可编辑/失去焦点
以上六个生命周期方法,两两成对出现
还有 onRestart 从onStop直接回到onStart
2.Activity 的状态
foreground activity 前台活动
visible activity 可见活动
background activity 后台活动
empty process 空进程
3.Android线程的层次
前台进程—|
课件进程—|
服务进程—|———存在的优先级也是由上到下越来越低
后台进程—|
空进程——|
4.如何保存Activity的状态
—–通常情况下Activity的状态会自动保存下来,虽然执行了onPause(),onStop()方法,activity的状态和数据也存在于内存中,但是,系统内存不足时,执行过onPause(),onStop() 方法的activity就可能会被销毁,数据自然就在内存中被销毁了。
—–这样我们就需要通过覆写onSaveInstanceState()方法来保存activity状态了,这个方法接收一个Bundle类型的参数,我们可以将状态数据存储到了个Bundle对象中,从而实现了状态保存。
—–不过需要注意的是,onSaveInstanceState()方法并不一定会被调用的,比如Back健退出方式,这个方式跳过生命周期方法,所以数据并没被保存下来,当然这种方式也并不需要将数据保存下来的,还有就是哦你SaveInstanceState()方法的调用要发生在onPause(),onStop()方法前。
5.两个Activity之间跳转时,生命周期方法的变化状况?
场景一:有A,B两个全屏非透明的Activity,在A里面开启B
执行顺序:A,onPause() — B,onCreat() – onStrat() – onResume() — A, onStop()
场景二:有A 全屏非透明的Activity,而B是一个透明的或者对话框的Activity,同样在A里面开启B
执行顺序:A,onPause() — B,onCreat() – onStrat() – onResume()
6.横竖屏切换时Activity的生命周期(先切横屏再切竖屏)
没有任配置的时候
竖屏切换到横屏 – onSaveInstanceState() — onPause() — onStop() — onDestroy() — onCreate() — onStart() —onSaveInstanceState() — onResume()
横屏切换到竖屏 – onSaveInstanceState() — onPause() — onStop() — onDestroy() — onCreate() — onStart() —onSaveInstanceState() — onResume()在AndroidManifest.xml中,把该Activity添加 Android:configChanges=”orientation”
时
竖屏切换到横屏 – onSaveInstanceState() — onPause() — onStop() — onDestroy() — onCreate() — onStart() —onSaveInstanceState() — onResume()
横屏切换到竖屏 – onConfigurationChanged()在AndroidManifest.xml中,把该Activity添加 android:configChanges=”orientation|
keyboardHidden”时
竖屏切换到横屏 – onConfigurationChanged()
横屏切换到竖屏 – onConfigurationChanged()
7.一次性推出一个打开多个Activity的Application
方案一:可以将每一个打开的Activity记录到一个List集合中,然后在需要关闭的时候,遍历集合并执行finish()方法
方案二:可以通过intent的flag的方式来实现intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)激活一个新的activity,其实就是相当给Activity配置启动模式为SingleTask,这样系统就会把这个上面的所有Activity全部干掉,然后再将这个Activity给finish掉就好了。
其实还有很多种方式,比如发送广播的方式,或者递归退出等方式,就不一一列举了。
8.Activity的四种启动模式
1.Standard:默认模式
这种模式的Activity的特点是:只要你创建了Activity实例,一旦激活该Activity,则会向任务栈中 加入新创建的实例,退出Activity则会在任务栈中销毁该实例。遵循后进先出原则。
2.SingleTop:
这种模式会考虑当前要激活的Activity实例在任务栈中是否正处于栈顶,如果处于栈顶则无需重新创建新的实例,会重用已存在的实例,否则会在任务栈中创建新的实例。
3.SingleTask
如果任务栈中存在该模式的Activity实例,则把栈中该实例以上的Activity实例全部移除,调用该实例的newInstance()方法重用该Activity,使该实例处於栈顶位置,否则就重新创建一个新的Activity实例。
4.SingleInstance
当该模式Activity实例在任务栈中创建后,只要该实例还在任务栈中,即只要激活的是该类型的Activity,都会通过调用实例的newInstance()方法重用该Activity,此时使用的都是同一个Activity实例,它都会处于任务栈的栈顶。此模式一般用于加载较慢的,比较耗性能且不需要每次都重新创建的Activity。
配置方式:(优先级方式二高于方式一)
方式一:activity启动模式的设置在AndroidManifest.xml文件中,通过配置Activity的属性android:launchMode=”“设置
方式二:在用Intent开启一个Activity时,在Intent中加入标志
9.Activity跳转的几种方式
方式一:显示调用
对于初学者来说,这个最常见,其中可以通过Intent传递数据
Intent intent=new Intent(MainActivity.this, SecondActivity.class);
startActivity(intent);
方式二:隐式调用
这种适合调用系统的界面,只要action、category、data和要跳转到的Activity在AndroidManifest.xml中设置的匹配就行。
<activity
android:name="com.example.android.tst.SecondActivity"
android:label="@string/title_activity_main" >
<intent-filter>
<action android:name="com.example.android.tst.SecondActivity"/>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
Intent intent=new Intent("com.example.android.tst.SecondActivity");
startActivity(intent);
方式三:调到另一Activity中,并可以在返回时返回数据
1.在跳转的Activity端,调用startActivityForResult(intent2, 1),跳转到下一个Activity,其中第一个参数为传入的意图对象,第二个为设置的请求码;
2.跳转到第二个Activity后,调用setResult(100, intent)方法可返回上一个Activity,其中第一个参数为结果码,第二个为传入的意图对象;
3.在第一个Activity通过onActivityResult()方法获得返回的数据。