速读原著-Android应用开发入门教程(屏幕间的跳转和事件的传递)

  • 2020 年 1 月 16 日
  • 筆記

6.4 屏幕间的跳转和事件的传递

在一般情况下,Android 的每一个屏幕基本上就是一个活动(Activity),屏幕之间的切换实际上就是在活动间互相调用的过程,Android 使用 Intent 完成这个动作。

Android 屏幕跳转的关系和方式如下图所示:

事实上,在 Android 中,屏幕使用一个活动来实现,屏幕之间是相互独立的,屏幕之间的跳转关系通过 Intent来实现。

6.4.1.跳转的方法

本示例是一个简单的屏幕之间的跳转,从一个屏幕跳转到另一个屏幕,在启动第二个屏幕后,前一个屏幕消失。

参考示例程序: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()函数。

6.4.2.带有返回值的跳转

在某些时候,从跳转的对象返回时,跳转源头需要得到其返回的结果,这样两个屏幕才可实现一些交互。 参考示例程序:ReceiveResult(ApiDemo => App=>Activity=>ReceiveResult) 源代码:com/example/android/apis/app/ReceiveResult.java

布局资源代码:receive_result.xmlsend_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()调用一个新的活动,实现屏幕的跳转功能,调用者可以获得跳转对象的返回信息。