1.背景:
通过startActivity启动的Activity独立于其父Activity,并且在关闭时不会提供任何反馈。
当需要反馈时,可以启动一个Activity作为另一个Activity的子Activity,用它向父Activity传递结果。子Activity只是以一种不同的方式启动的Activity。因此,也必须像其他的Activity 一样,在应用程序的manifest文件中注册。
在manifest文件中注册的任何Activity都可以作为子Activity打开,包括系统Activity或第三方的应用程序Activity。
当子Activity结束时,它会触发父Activity(即调用它的Activity)的事件处理程序onActivityResult。
对于一个Activity为另一个Activity提供数据输入的情况,子Activity特别适用。
2.下面来看一个例子:完成子Activity向父Activity返回数据的功能。
先来看一下效果:
1》运行开始
其布局如下:
activity_main.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"
tools:context="com.demo.parameterdemo.MainActivity" >
<TextView
android:id="@+id/show_tv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="在这里显示子Activity返回的内容" />
<Button
android:id="@+id/startSubActivity"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="启动子Activity" />
</LinearLayout>
startActivityForResult的工作方法和startActivity相似,但是有一个重要的区别。除了传入显式或隐式的Intent来决定启动哪个Activity以外,还需要传入一个请求码。这个值将在后面用于唯一标识返回了的子Activity。
“启动子Activity”事件处理代码如下:
// 启动子Activity,并从中获取返回信息
private void startSubActivity() {
Intent startIntent = new Intent(getApplicationContext(),
SubActivity.class);
startActivityForResult(startIntent, ACTIVITY_REQUEST_CODE);
}
2》点击“启动子Activity”
其布局如下:
Activity_sub.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"
tools:context="com.demo.parameterdemo.SubActivity" >
<EditText
android:id="@+id/subEditText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="在这里输入要返回的信息..." />
<Button
android:id="@+id/submitButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="返回信息" />
</LinearLayout>
3》输入要返回的信息
当准备好返回时,可以在调用finish前调用SetResult,以便向父Activity返回一个结果
“返回信息”的事件处理代码如下:
// 返回信息,执行结束会触发Caller的onActivityResult方法
private void returnResult() {
Intent returnIntent = new Intent();
// 通过Intent将信息返回
returnIntent.putExtra(RETURN_INFO, subEditText.getText().toString());
/**
void android.app.Activity.setResult(int resultCode, Intent data)
Parameters:
resultCode: The result code to propagate back to the
originating activity, often RESULT_CANCELED or RESULT_OK
data: The data to propagate back to the originating activity.
* */
this.setResult(RESULT_OK, returnIntent);
this.finish();
}
4》点击“返回信息”
3.实现过程
1》父Activity的代码如下:
MainActivity.java
package com.demo.parameterdemo;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends Activity {
// 声明控件
private TextView showTextView;
private Button startSubActivityButton;
// 请求码
private static final int ACTIVITY_REQUEST_CODE = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
}
// 初始化
private void init() {
// 得到相应控件的引用
showTextView = (TextView) findViewById(R.id.show_tv);
startSubActivityButton = (Button) findViewById(R.id.startSubActivity);
// 注册事件
startSubActivityButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
startSubActivity();
}
});
}
// 启动子Activity,并从中获取返回信息
private void startSubActivity() {
Intent startIntent = new Intent(getApplicationContext(),
SubActivity.class);
startActivityForResult(startIntent, ACTIVITY_REQUEST_CODE);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == ACTIVITY_REQUEST_CODE
&& resultCode == Activity.RESULT_OK) {
// 获取子Activity返回的信息
String info = data.getStringExtra(SubActivity.RETURN_INFO);
showTextView.setText(info);
}
}
}
2》子Activity的代码如下:
SubActivity.java
package com.demo.parameterdemo;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
public class SubActivity extends Activity {
// 声明控件
private EditText subEditText;
private Button submitButton;
// 用于唯一标识要返回的信息
// 应该尽量的长,最好加上所在类的全名,即:包名+类名+参数名
public static final String RETURN_INFO = "com.demo.parameterdemo.SubActivity.info";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sub);
init();
}
// 初始化
private void init() {
// 得到相应控件引用
subEditText = (EditText) findViewById(R.id.subEditText);
submitButton = (Button) findViewById(R.id.submitButton);
// 注册事件
submitButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
returnResult();
}
});
}
// 返回信息,执行结束会触发Caller的onActivityResult方法
private void returnResult() {
Intent returnIntent = new Intent();
// 通过Intent将信息返回
returnIntent.putExtra(RETURN_INFO, subEditText.getText().toString());
this.setResult(RESULT_OK, returnIntent);
this.finish();
}
}