Activity之间数据传输

使用putExtra()方法传递数据

使用IntentputExtra()方法传输数据。

/**
*将扩展数据添加到该意图。该名称必须包含一个包前缀,例如,应用com.android.contacts将使用之类的名称,例如“com.android.contacts.ShowAll”。
 *
 * @param name 数据的名称。
 * @param value 数据的信息。
 *
 * @return 返回相同的Intent对象,用于将多个调用链接到一个语句中。
 *
 * @see #putExtras
 * @see #removeExtra
 * @see #getStringExtra(String)
 */
public @NonNull Intent putExtra(String name, @Nullable String value) {
    if (mExtras == null) {
        mExtras = new Bundle();
    }
    mExtras.putString(name, value);
    return this;
}

代码演示

// MainActivity 跳转到 Main2Activity 并且带上数据。
Intent intent = new Intent();
intent.setClass(this, Main2Activity.class);
intent.putExtra("data", "contnet");
startActivity(intent);
// 接收MainActivity传递过来的数据。
Intent intent = getIntent();
String data = intent.getStringExtra("data");
Toast.makeText(this, data, Toast.LENGTH_SHORT).show();

使用Bundle类传递数据

MainActivity中就数据传输到Main2Activity

// 传输数据
Intent intent = new Intent();
intent.setClass(this, Main2Activity.class);
Bundle bundle = new Bundle();
bundle.putString("data","content");
intent.putExtras(bundle);
startActivity(intent);
// 接收数据
Bundle bundle = getIntent().getExtras();
String data = bundle.getString("data");
Toast.makeText(this, data, Toast.LENGTH_SHORT).show();

数据传回

startActivityForResult()方法介绍

/**
 * 与没有任何选项的调用{@link #startActivityForResult(Intent,int,Bundle)} 相同。
 *
 * @param intent 开始的意图。
 * @param requestCode 如果> = 0,则活动退出时,此代码将在onActivityResult()中返回。
 *
 * @throws android.content.ActivityNotFoundException
 *
 * @see #startActivity
 */
public void startActivityForResult(@RequiresPermission Intent intent, int requestCode) {
    startActivityForResult(intent, requestCode, null);
}

setResult()方法介绍

/**
 * 调用此选项可设置您的活动将返回到其调用者的结果。
 *
 * 自{@link android.os.Build.VERSION_CODES#GINGERBREAD}起,您在此处提供的Intent可以具有{@link Intent#FLAG_GRANT_READ_URI_PERMISSION
 * Intent.FLAG_GRANT_READ_URI_PERMISSION}和/或{@link Intent#FLAG_GRANT_WRITE_URI_PERMISSION。 FLAG_GRANT_WRITE_URI_PERMISSION}集。
 * 这将授予 Activity接收结果以访问Intent中特定URI的权限。 
 * 访问将一直保留到活动完成为止(它将在整个托管过程中保持进程被杀死和其他临时破坏),并将被添加至它已经拥有的任何现有URI权限集合中。
 *
 * @param resultCode 结果代码将传播回原始活动,通常为RESULT_CANCELED或RESULT_OK
 * @param data 数据传播回原始活动。
 *
 * @see #RESULT_CANCELED
 * @see #RESULT_OK
 * @see #RESULT_FIRST_USER
 * @see #setResult(int)
 */
public final void setResult(int resultCode, Intent data) {
    synchronized (this) {
        mResultCode = resultCode;
        mResultData = data;
    }
}

onActivityResult()方法介绍

/**
 * 在您启动的活动退出时调用,为您提供开始的requestCode,
 * 返回的resultCode以及其中的所有其他数据。如果活动明确返回了resultCode,则它们将是
 * {@link #RESULT_CANCELED},没有返回任何结果,或者在其操作过程中崩溃了。
 *
 * 活动重新开始时,您将在onResume()之前立即收到此呼叫。
 *
 * 如果您的活动将 {@link android.R.styleable#AndroidManifestActivity_noHistory noHistory}设置为true,则永远不会调用此方法。
 *
 * @param requestCode 最初提供给 startActivityForResult()的整数请求代码,使您可以识别此结果的来源。
 * @param resultCode 子活动通过其setResult()返回的整数结果代码。
 * @param data 一个Intent,可以将结果数据返回给调用方(各种数据可以附加到Intent“ extras”)。
 *
 * @see #startActivityForResult
 * @see #createPendingResult
 * @see #setResult(int)
 */
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
}

MainActivity跳转到Main2Activity。

Intent intent = new Intent();
intent.setClass(this, Main2Activity.class);
startActivityForResult(intent, 1);

Main2Activity返回MainAcivity并且带上数据。

Intent intent = new Intent();
intent.putExtra("data", "content");
setResult(2, intent);
finish();

MainActivity使用onActivityResult接收Main2Activity返回回来的数据。

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == 1 || requestCode == 2) {
        String resultDate = data.getStringExtra("data");
        Toast.makeText(this, resultDate, Toast.LENGTH_SHORT).show();
    }
}

ins: borusushi