Android学习笔记之启动activity& Intent

一个activity启动另一个activity简单的方式是使用startActivity方法。

public void startActivity(Intent intent) 

你也许会想当然地认为,startActivity(Intent)方法是一个静态方法,启动activity就是 调用Activity子类的该方法。实际并非如此。activity调用startActivity(Intent)方法时,调 用请求实际发给了操作系统。 准确地说,调用请求发送给了操作系统的ActivityManager。ActivityManager负责创建 Activity实例并调用其onCreate(Bundle)方法,如图5-7所示。
这里写图片描述


基于 intent的通信
intent对象是component用来与操作系统通信的一种媒介工具。目前为止,我们唯一见过的 component就是activity。实际上还有其他一些component:service、broadcast receiver以及content provider。
intent是一种多用途通信工具。Intent类有多个构造方法,能满足不同的使用需求。
,intent用来告诉ActivityManager该启动哪个activity,因此可使用以下构 造方法:

public Intent(Context packageContext, Class<?> cls) 

传入该方法的Class类型参数告诉ActivityManager应该启动哪个activity;Context参数告 诉ActivityManager在哪里可以找到它,如图5-8所示。
这里写图片描述

 Intent intent=new Intent(QuizActivity.this,CheatActivity.class);
 startActivity(intent);

在启动activity前,ActivityManager会确认指定的Class是否已在manifest配置文件中声明。如果已完成声明,则启动activity,应用正常运行。反之,则抛出ActivityNotFoundException 异常,应用崩溃。这就是必须在manifest配置文件中声明应用的全部activity的原因


显式intent与隐式intent
如果通过指定Context与Class对象,然后调用intent的构造方法来创建Intent,则创建的是 显式intent。在同一应用中,我们使用显式intent来启动activity。

一个应用的activity如需启动另一个应用的activity,可通过创建隐式intent来处理。


使用intent extra
为通知CheatActivity当前问题的答案,需将以下语句的返回值传递给它:

mQuestionBank[mCurrentIndex].isAnswerTrue() 

该值将作为extra信息,附加在传入startActivity(Intent)方法的Intent上发送出去。 extra信息可以是任意数据,它包含在Intent中,由启动方activity发送出去。可以把extra信 息想象成构造函数参数,虽然我们无法使用带activity子类的构造函数。(Android创建activity实 例,并负责管理其生命周期。)接受方activity接收到操作系统转发的intent后,访问并获取其中的 extra数据信息,如图5-10所示。
这里写图片描述
要将extra数据信息添加给intent,需要调用Intent.putExtra(…)方法。

public Intent putExtra(String name, boolean value) 

Intent.putExtra(…)方法形式多变。不变的是,它总是有两个参数。一个参数是固定为 String类型的键,另一个参数是键值,可以是多种数据类型。该方法返回intent自身,因此,需 要时可进行链式调用。
可以附加多个extra到同一个Intent上。如果附加多 个extra,也要给newIntent(…)方法相应添加多个参数。
要从extra获取数据,会用到如下方法:

public boolean getBooleanExtra(String name, boolean defaultValue) 

第一个参数是extra的名字。getBooleanExtra(…)方法的第二个参数是指定默认值(默认 答案),它在无法获得有效键值时使用。


从子activity获取返回结果
需要从子activity获取返回信息时,可调用以下Activity方法:

public void startActivityForResult(Intent intent, int requestCode)

该方法的第一个参数同前述的intent。第二个参数是请求代码。请求代码是先发送给子 activity,然后再返回给父activity的整数值,由用户定义。在一个activity启动多个不同类型的子 activity,且需要判断消息回馈方时,就会用到该请求代码。虽然QuizActivity只启动一种类型 的子activity,但为应对未来的需求变化,现在就应设置请求代码常量。

1. 设置返回结果
实现子activity发送返回信息给父activity,有以下两种方法可用:

public final void setResult(int resultCode) 
public final void setResult(int resultCode, Intent data) 

一般来说,参数resultCode可以是以下任意一个预定义常量。

  1. Activity.RESULT_OK
  2. ctivity.RESULT_CANCELED
    (如需自己定义结果代码,还可使用另一个常量:RESULT_FIRST_USER。)
    子activity可以不调用setResult(…)方法。如果不需要区分附加在intent上的结果或其他信 息,可让操作系统发送默认的结果代码。如果子activity是以调用startActivityForResult(…) 方法启动的,结果代码则总是会返回给父activity。在没有调用setResult(…)方法的情况下, 如果用户按了后退按钮,父activity则会收到Activity.RESULT_CANCELED的结果代码。
    2. 返还intent
    需要创建一个Intent,附 加上extra信息后,调用Activity.setResult(int, Intent)方法将信息回传给QuizActivity。

在用户按后退键回到QuizActivity时,ActivityManager调用父activity的以下方法:

protected void onActivityResult(int requestCode, int resultCode, Intent data) 

该方法的参数来自QuizActivity的原始请求代码以及传入setResult(int,Intent)方法 的结果代码和intent。
这里写图片描述
后覆盖QuizActivity的onActivityResult(int, int, Intent)方法来处理返回结果。 然而,结果intent的内容也是CheatActivity的实现细节,因而还要添加另一个方法协助解析出 QuizActivity能用的信息。

public static boolean wasAnswerShown(Intent result) {     
    return result.getBooleanExtra(EXTRA_ANSWER_SHOWN, false); 
}

3. 处理返回结果
在QuizActivity.java中,新增一个成员变量保存CheatActivity回传的值。然后覆盖 onActivityResult(…)方法获取它。别忘了检查请求代码和返回代码是否符合预期。

猜你喜欢

转载自blog.csdn.net/qq_40104617/article/details/82592744