一、简介
Activity是应用的用户界面,它运行于进程的主线程中。为了良好的用户体验,应该把会造成延迟的操作(例如网络访问)交给其他线程去做。
二、启动Activity
Activity有两种启动方式,一种是用户点击应用图标进入应用的主Acitivity,一种是根据需要用代码启动某个Activity。前者是由系统在应用的AndroidManifest.xml文件(所有Activity都应该在它里面注册相应的节点)中找到包含以下intent-filter节点的activity:
<manifest ...>
...
<application ...>
<activity
android:name=".MainActivity" ...>
<!-- 这个intent-filter的子元素表明这个Activity是本应用的主Activity。 -->
<!-- 还有其他元素可供选择,也可以不设置intent-filter -->
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
...
</application>
</manifest>
然后再去找到对应的Activity类(比如上面的“MainActivity”)来启动它。后者是通过设置意图内容(Intent),接着在某个Activity中调用startAcivity()或者startActivityForResult()来启动目标Activity,例如:
Intent intent = null;
if (hasTargetAcivityName)
{
// 启动一个指定类名的Activity
intent = new Intent(ThisActivity.this, TargetActivity.class);
}
else
{
/**
* 启动一个能实现某个功能的Activity。
* 如果有多个,系统会交给用户选择
*/
intent = new Intent (Intent.ACTION_XXXXX);
intent.putExtra(/* 本方法有多种重载版本 */);
if(null == intent.resolveActivity(getPackageManager()))
{
// 如果没有能处理这个Intent的Activity
}
}
if (isNotNeedResult)
{
// 启动目标Activity,不需要其答复结果
startActivity(intent);
}
else
{
// 启动目标Activity,等待其答复结果
startActivityForResult(intent, REQUEST_CODE /* 这个请求码可以自定义 */);
/**
* 目标Activity可以在其onCreate()中调用getIntent()
* 来接收Intent。在执行完之后,调用
* setResult(RESULT_OK /* 这个结果码也可以自定义 */, intent);
* 以及调用finish()关闭自身,即可答复运行结果。
*
* 本Activity只需要实现这个方法:
* protected void onActivityResult(int requestCode, int resultCode, Intent data);
* 就可以在它里面处理目标Activity的执行结果。
*/
}
不管是哪种方式,一个Activity的启动过程中必定会调用到它的onCreate方法。在这个方法中,我们通常会调用setContentView(R.layout.XXX)来设置界面,以及调用findViewById(R.id.XXX)来对界面上的控件进行配置。
三、生命周期
上图所展示的是,用户的焦点在不同的Activity之间切换时,当前Activity的应对方法。在这些方法中,onPause是Activity的第二个非常重要的方法。它是用户离开Activity时由系统调用的处理方法,在它里面需要进行一些保存用户数据的工作。由于内存是有限的,不同的应用会对内存资源形成竞争关系。当内存过低或者不够用时,系统就会杀掉一些应用进程,优先级越低的越容易被杀死:
package com.example.wesnoth;
import android.app.Activity;
import android.os.Bundle;
public class TestActivity extends Activity
{
/**
* Activity的整个生命周期从这里开始
*/
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
/**
* 在这里,我们通常会调用setContentView(R.layout.XXX)来设置界面,
* 以及调用findViewById(R.id.XXX)来对界面上的控件进行配置。
*/
setContentView(R.layout.XXXXXX);
}
/**
* 当用户重新导航到这个Activity
*/
@Override
protected void onRestart()
{
super.onRestart();
}
/**
* 当Activity进入用户视野
*/
@Override
protected void onStart()
{
super.onStart();
}
/**
* 当Activity获得用户焦点
*/
@Override
protected void onResume()
{
super.onResume();
/** 例如初始化相机 */
}
/**
* 当Activity失去用户焦点
*/
@Override
protected void onPause()
{
super.onPause();
/** 例如暂停播放视频、释放相机等资源 */
}
/**
* 当Activity不再可见
*/
@Override
protected void onStop()
{
super.onStop();
/** 例如写数据库。这时系统会保存控件的信息,等用户重新进入这个Activity时恢复,包括用户在EditText的输入 */
}
/**
* Activity的整个生命周期在这里结束
*/
@Override
protected void onDestroy()
{
super.onDestroy();
/** 注意:屏幕方向改变时,Activity会被销毁并重新创建 */
}
/** 在onStop前调用 */
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
// 保存额外的信息
savedInstanceState.put...(...);
// 让父类保存控件状态
super.onSaveInstanceState(savedInstanceState);
}
/** 在onStart后调用 */
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
// 让父类恢复控件状态
super.onRestoreInstanceState(savedInstanceState);
// 获取保存的额外信息
变量 = savedInstanceState.get...(...);
}
}