Activity的理解:
作用:提供能让用户操作并与之交互的界面
1.定义
a. 定义一个类 extends Activity, 并重写生命周期方法
b. 在功能清单文件中使用<activity>注册
2.启动方式两种:
a. 一般: startActivity(Intent intent)
b. 带回调启动: startActivityForResult(Intent intent, int requestCode)
重写: onActivityResult(int requestCode, int resultCode, Intent data)
3. 结束
a. 一般: finish()
b. 带结果的: setResult(int resultCode, Intent data)
Activity的生命周期 及状态
onCreate() : 加载布局和初始化的工作
onResume() : 只有经历此方法, 才进入运行状态
onDestroy() : 在对象死亡之前, 做一些收尾或清理的工作
异常情况下的生命周期
异常情况下Activity终止:系统会调用onSaveInstance来保存当前activity
状态,这个方法的调用时机是在onStop之前
与onPause
没有既定的时序关系,当activity
重新创建后,系统会调用onRestoreInstanceState
,并且把activity
销毁时onSaveInstanceState
方法保存的Bundle
对象作为参数同时传递给onRestoreInstanceState和onCreate方法。onRestoreInstanceState()onStart()方法后回调。
同时,在onSaveInstanceState
和onRestoreInstanceState
方法中,系统自动为我们做了一些恢复工作,如:文本框(EditeText
)中用户输入的数据,ListView
滚动的位置等,这些view相关的状态系统都能够默认为我们恢复。可以查看view
源码,和activity
一样,每个view都有onSaveInstanceState方法和onRestoreInstanceState方法
。
onConfigurationChanged方法
1.当系统的配置信息发生改变
系统会调用此方法注意,只有在配置文件AndroidManifest中处理了configChanges属性对应的设备配置,该方法才会被调用。如果发生设备配置与在配置文件中设置的不一致,则Activity会被销毁并使用新的配置重建。
2.configChanges设置取值
TaskStack和lauchMode
1). TaskStack
在Android中,系统用Task Stack (Back Stack)结构来存储管理启动的Activity对象
一个应用启动,系统就会为其创建一个对应的Task Stack来存储并管理该应用的Activity对象
只有最上面的任务栈的栈顶的Activity才能显示在窗口中
Stack<Activity> activityStack = new Stack();
2). lauchMode:
standard:
标准模式,每次调用startActivity()方法就会产生一个新的实例。
singleTop:
如果已经有一个实例位于Activity栈的顶部时,就不产生新的实例;如果不位于栈顶,会产生一个新的实例。
如果新activity位于任务栈的栈顶的时候,activity不会被重新创建,同时它的onNewIntent方法会被回调。 注意:这个activity的 onCreate,onStart,onResume不会被回调,因为他们并没有发生改变。
singleTask:
栈内复用模式,只有一个实例, 默认在当前Task中。只要activity在一个栈中存在,那么多次启动此activity不会被重新创建单例,系统会回调onNewIntent。
singleInstance:
只有一个实例, 创建时会新建一个栈, 且此栈中不能有其它对象
注意:默认情况下,所有activity所需的任务栈的名字为应用的包名,可以通过给activity指定TaskAffinity属性来指定任务栈,**这个属性值不能和包名相同,否则就没有意义 ** 。
setResult和finish调用的注意方式及场景
Activity_A通过StartActivityForResult()启动Activity_B,Activity_B通过setResult()返回值给Activity_A
注意:setResult()方法必须在finish()之前调用,setResult()方法在onPause()之前调用。
1.点击Back键返回到Activity_A,Back键Android会自动调用Activity的finish()方法,
@Override
public void onBackPressed()
{
Log.i(TAG, "onBackPressed");
setResult(Const.LIVE_OK);
super.onBackPressed();
}
执行过程为:
B---onBackPressed
B---finish
B---onPause
A---onActivityResult
A---onRestart
A---onStart
A---onResume
B---onStop
B---onDestroy
2.点击按钮事件显示的调用finish()
setResult(intent, RESULT_OK);
finish();
Scheme跳转协议