在一般情况下,Android 的每一个屏幕基本上就是一个活动(Activity),屏幕之间的切换实际上就是在活动间互相调用的过程,Android 使用 Intent 完成这个动作。
Android 屏幕跳转的关系和方式如下图所示:
事实上,在 Android 中,屏幕使用一个活动来实现,屏幕之间是相互独立的,屏幕之间的跳转关系通过 Intent来实现。
本示例是一个简单的屏幕之间的跳转,从一个屏幕跳转到另一个屏幕,在启动第二个屏幕后,前一个屏幕消失。
参考示例程序:Forward(ApiDemo => App=>Activity=>Forward)
源代码:com/example/android/apis/app/Forward.java
com/example/android/apis/app/ForwardTarget.java
布局资源代码:forward_target.xml 和 forwarding.xml
本示例包含了两个活动,在 UI 上它们就是两个屏幕,分别为跳转的源和目的,因此在AndroidManifest.xml
中分别定义。
<activity android:name=".app.Forwarding"
android:label="@string/activity_forward ding">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.SAMPLE_CODE" />
</intent-filter>
</activity>
<activity android:name=".app.ForwardTarget"> </activity>
两个活动的名称分别为 Forwarding 和 ForwardTarget,由于第二个活动没有 intent-filter,因此在程序中只能由第一个活动来启动。
Forward 程序的运行结果如图所示:
点击“Go”按钮从 Forward 跳转到 ForwardTarget,这个内容在 Java 源文件 Forward.java 的以下片段中处理:
public void onClick(View v) {
Intent intent = new Intent(); // 建立 Intent
intent.setClass(Forwarding.this, ForwardTarget.class); // 设置活动
startActivity(intent);
finish(); // 结束当前活动
}
启动第二个活动需要使用 Intent,在其 setClass()函数中设置源和返回的内容,Intent 是android.content
包中的类,用于启动活动、服务或者消息接收器。
这里使用的 Intent 的 setClass()的方法的原型如下所示:
Intent setClass(Context packageContext, Class<?> cls)
第一个参数是当前的上下文类型 Context,因此把当前的活动设置过去即可(Activity 本身继承了 Context),第二个是 Intent 所包含的 JAVA 类,直接设置 ForwardTarget.class 类即可。
本例中使用了 finish()函数表示当前的活动结束,这样在第二个活动(ForwardTarget)启动时,第一个活动(Forward)已经不存在了。如果没有调用 finish()函数,第二个活动启动时,第一个活动就处于 OnPause 状态,当第二个活动退出后,第一个活动重新出现,也就是会调用活动的 onResume()函数。
在某些时候,从跳转的对象返回时,跳转源头需要得到其返回的结果,这样两个屏幕才可实现一些交互。
参考示例程序:ReceiveResult(ApiDemo => App=>Activity=>ReceiveResult)
源代码:com/example/android/apis/app/ReceiveResult.java
布局资源代码:receive_result.xml
和 send_result.xml
<activity android:name=".app.ReceiveResult"
android:label="@string/activity_receive_result">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.SAMPLE_CODE" />
</intent-filter>
</activity>
<activity android:name=".app.SendResult"> </activity>
ReceiveResult 程序的运行结果如图所示:
初始化界面如图所示,点击“Get Result”按钮将跳转到第二个屏幕,如中图所示;在第二个屏幕中点击“Corky”和“Violet”按钮将返回第一个屏幕,并获得对应显示,如右图所示。
Java 源文件 ReceiveResult.java 的代码片段如下所示:
static final private int GET_CODE = 0;
private OnClickListener mGetListener = new OnClickListener() {
public void onClick(View v) {
Intent intent = new Intent(ReceiveResult.this, SendResult.class);
startActivityForResult (intent, GET_CODE);
}
};
这里调用的是 startActivityForResult()方法,设置一个 GET_CODE 为请求代码,这样可以获得目标活动的返回信息。这个函数的原型为:
public void startActivityForResult (Intent intent, int requestCode)
被跳转的目标的 Java 源文件 SendResult.java 的代码片段如下所示:
private OnClickListener mCorkyListener = new OnClickListener() {
public void onClick(View v) {
setResult(RESULT_OK, (new Intent()).setAction("Corky!"));
finish();
}
};
private OnClickListener mVioletListener = new OnClickListener() {
public void onClick(View v) {
setResult(RESULT_OK, (new Intent()).setAction("Violet!"));
finish();
}
};
被跳转的目标程序将返回值返回,这里使用的依然是 Intent 作为交互的信息,通过 setAction()设置不同的活动。
由于被跳转的目标程序,是被显示 Intent 调用起来的。因此,返回后继续由 ReceiveResult.java 对返回值进行处理。返回的信息通过扩展 Activity 的 onActivityResult()函数来实现,两个整数类型的参数 requestCode 和 resultCode分别代表请求代码和结果码,第三个参数 Intent(类型 data)表示活动间交互附加的数据信息。
@Override
protected void onActivityResult(int requestCode, int resultCode,
Intent data) {
if (requestCode == GET_CODE) {
Editable text = (Editable)mResults.getText();
if (resultCode == RESULT_CANCELED) {
text.append("(cancelled)");
} else {
text.append("(okay ");
text.append(Integer.toString(resultCode));
text.append(") ");
if (data != null) {
text.append(data.getAction());
}
}
text.append("\n");
}
}
这里 onActivityResult()是一个被继承的函数,其参数 data 就是这个活动作为返回值接受到,data.getAction()可以从返回的 Intent 中取回内容。
这里的参数 requestCode 也是根据当时的在调用 startActivityForResult()的时候指定的返回值。Android 中使用 Intent 并使用 startActivity()和 startActivityForResult()调用一个新的活动,实现屏幕的跳转功能,调用者可以获得跳转对象的返回信息。