内容提要
Activity 用于提供用户与应用交互的界面。
创建Activity
1. 扩展Activity类(也可以是ListActivity当需要使用List view的时候);
public class YourActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
}
2. 实现一个用户操作接口,使用setContentView方法来设定一个布局。最常用的方法是通过一个XML格式的布局文件来保存应用的资源,这样能将用户界面的维护跟定义应用逻辑的源代码分离。查看更多在Widgets 和 Layout。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<LinearLayout
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1">
…
</LinearLayout>
<LinearLayout
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1">
…
</LinearLayout>
</LinearLayout>
3. 在资源列表文件中声明这个activity并设定intent filter。查看更多在 The Manifest 和 Intents。
<activity android:name=".ExampleActivity" android:icon="@drawable/app_icon">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
一个应用通常有多个activity,这些acitiviy互相松散的关联着。通常有一个activity被设置为应用的“main”activity,作为用户第一次启动应用时能看到的界面。在manifest文件中定义某个activity为main。查看更多在The ManifestFile。
<activity android:name=".ExampleActivity" android:icon="@drawable/app_icon">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
Activity生命周期
Activity有三种状态:运行中、暂停和停止;划分三个内嵌的生命周期:整体周期(从onCreate到onDestroy)、可见周期(从onRestart到onStop)和前端周期(从onResume到onPause)。
常常重写的方法:
onCreate方法。当Activity不存在而创建时调用;所有初始化代码需要放置在这里。
onResume方法。当Activity已经出现在最前端开始能和用户交互时调用;通常用来更新视图。
onPause方法。当另一个Activity出现在最前端时调用;通常用来提交持久化数据。
保存Activity实例状态
实例状态是指activity用户界面的状态(例如输入框内的字符,选择框的勾选状态等等),与持久化状态(例如文件、数据库)不同的是实例状态与Activity的实例存在时间一样;
为什么要保存实例状态?因为系统对某些状态的Activity具有销毁的控制权,而用户的操作行为有令Activity成为销毁对象的可能(例如在输入框中打入了内容突然一个短信提示将输入框界面带入了暂停状态,此时系统若因为资源不足而销毁了此Activity,用户回来之后会发现输入的内容因为一个短信而全部删除),所以需要保存实例状态,即使是一个新的Activity对象用户也感觉不到任何变化,而保存实例状态的原因就是由于Activity会被销毁。
通过重写onSaveInstanceState方法和onRestoreInstanceState方法来实现存储和读取保存的实例状态。也可以将onRestoreInstanceState里的实现放在onCreate方法中,效果一样。
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
if ((savedInstanceState != null) &&
savedInstanceState.containsKey(COUNT_KEY)) {
count = savedInstanceState.getInt(COUNT_KEY);//实例变量
}
super.onRestoreInstanceState(savedInstanceState);
}
@Override
protected void onSaveInstanceState(Bundle outState) {
outState.putInt(COUNT_KEY, count);
super.onSaveInstanceState(outState);
}
Tasks 和Back Stack
1. 任务是指一组activity的集合,这些集合在一块儿的activity完成某项工作;这些activity被组织为一个栈称作“back stack”,按照activity打开的顺序排列(最先打开的在最底层);
2. 当activity A 启动activity B, B展现在最前端,A停止并且由系统保存它的实例状态,back stack中A在B的下方,B处于最顶端,此时当用户按下Back键,B从栈顶端移除,activity对象销毁,A重新展现在最前端并且重新装载系统保存的实例状态;
当用户在运行着某个activity时按下HOME键,那么整个正在运行着的任务回到后端,其中所有的activity都被系统保存下实例状态。在用户再次点击该应用的启动图标时,在后端的任务重新回到前端,并且展现最后离开时的activity。