signed

QiShunwang

“诚信为本、客户至上”

02 Activity间的数据传递

2021/6/24 16:03:25   来源:

创建新的activity

右键单击com.example.geoquiz包,选择New => Activity => Empty Activity,新建CheatActivity类。

CheatActivity类的布局文件activity_cheat.xml为:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center"
    tools:context="com.example.geoquiz.CheatActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="24dp"
        android:text="@string/warning_text" />

    <TextView
        android:id="@+id/answerTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="24dp"
        tools:text="答案" />

    <Button
        android:id="@+id/showAnswerButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/show_answer_button" />

</LinearLayout>

用于显示答案的TextView组件,它的tools和tools:text属性的命名空间比较特别。该命名空间可以覆盖组件的任何属性,以便在AS预览中进行不同的展示。我们可以为TextView的text属性提供初始值,在应用运行前就知道它大概的样子,而且应用运行时,文字不会显示出来。

在manifest配置文件中声明activity

AndroidManifest.xml文件用来向Android操作系统描述应用,应用的所有activity都必须在manifest配置文件中声明。使用AS向导创建activity,向导已自动完成声明工作。

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.geoquiz">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".CheatActivity"></activity>
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

启动activity

基于intent的通信

intent对象是component用来与操作系统通信的一种媒介工具,component有activity、service、broadcast receiver、content provider等。

可以使用Intent类的以下构造方法来告诉ActivityManager该启动哪个activity:

/**
 * @param packageContext Context 在这个packageContext可以找到要启动的activity
 * @param cls Class 要启动的activity的类
 */
Intent intent = new Intent(MainActivity.this, CheatActivity.class);

然后调用startActivity(Intent)方法启动CheatActivity:

startActivity(intent);

使用intent extra

要将extra数据信息添加给intent,需要调用Intent.putExtra(String, T)方法。第一个参数是String类型的键,第二个参数可以是多种数据类型,该方法返回intent自身。

intent.putExtra(EXTRA_ANSWER, answer);

获取extra信息的方法为:

mAnswer = getIntent().getBooleanExtra(EXTRA_ANSWER, false);

注意,Activity.getIntent()方法返回了由startActivity(Intent)方法转发的Intent对象。


从子activity获取返回结果

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

/**
 * 需要从子activity返回信息给父activity,调用此方法启动
 * @param intent Intent
 * @param int requestCode 请求代码,有多个子activity时用于区分
 */
startActivityForResult(intent, REQUEST_CODE_CHEAT);

实现子activity发送返回信息给父activity,可以调用以下方法:

setResult(RESULT_OK, intent);

用户单击后退键回到MainActivity时,ActivityManager会调用父activity的以下方法:

/** * 子activity回到父activity,处理返回结果 * @param requestCode int 请求代码,有多个子activity时用于区分 * @param resultCode int 结果代码 * @param data Intent */@Overrideprotected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {    if (resultCode != Activity.RESULT_OK) return;    if (requestCode == REQUEST_CODE_CHEAT) {        if (data == null) return;        mIsCheated = CheatActivity.getAnswerShown(data);    }}