从Activity返回结果
1.背景:
通過(guò)startActivity啟動(dòng)的Activity獨(dú)立于其父Activity,并且在關(guān)閉時(shí)不會(huì)提供任何反饋。
當(dāng)需要反饋時(shí),可以啟動(dòng)一個(gè)Activity作為另一個(gè)Activity的子Activity,用它向父Activity傳遞結(jié)果。子Activity只是以一種不同的方式啟動(dòng)的Activity。因此,也必須像其他的Activity 一樣,在應(yīng)用程序的manifest文件中注冊(cè)。
在manifest文件中注冊(cè)的任何Activity都可以作為子Activity打開(kāi),包括系統(tǒng)Activity或第三方的應(yīng)用程序Activity。
當(dāng)子Activity結(jié)束時(shí),它會(huì)觸發(fā)父Activity(即調(diào)用它的Activity)的事件處理程序onActivityResult。
對(duì)于一個(gè)Activity為另一個(gè)Activity提供數(shù)據(jù)輸入的情況,子Activity特別適用。
2.下面來(lái)看一個(gè)例子:完成子Activity向父Activity返回?cái)?shù)據(jù)的功能。
先來(lái)看一下效果:
1》運(yùn)行開(kāi)始
其布局如下:
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" ><TextViewandroid:id="@+id/show_tv"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="在這里顯示子Activity返回的內(nèi)容" /><Buttonandroid:id="@+id/startSubActivity"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="啟動(dòng)子Activity" /></LinearLayout>
startActivityForResult的工作方法和startActivity相似,但是有一個(gè)重要的區(qū)別。除了傳入顯式或隱式的Intent來(lái)決定啟動(dòng)哪個(gè)Activity以外,還需要傳入一個(gè)請(qǐng)求碼。這個(gè)值將在后面用于唯一標(biāo)識(shí)返回了的子Activity。
“啟動(dòng)子Activity”事件處理代碼如下:
// 啟動(dòng)子Activity,并從中獲取返回信息private void startSubActivity() {Intent startIntent = new Intent(getApplicationContext(),SubActivity.class);startActivityForResult(startIntent, ACTIVITY_REQUEST_CODE);}
2》點(diǎn)擊“啟動(dòng)子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" ><EditTextandroid:id="@+id/subEditText"android:layout_width="match_parent"android:layout_height="wrap_content"android:hint="在這里輸入要返回的信息..." /><Buttonandroid:id="@+id/submitButton"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="返回信息" /></LinearLayout>
3》輸入要返回的信息
當(dāng)準(zhǔn)備好返回時(shí),可以在調(diào)用finish前調(diào)用SetResult,以便向父Activity返回一個(gè)結(jié)果
“返回信息”的事件處理代碼如下:
// 返回信息,執(zhí)行結(jié)束會(huì)觸發(fā)Caller的onActivityResult方法private void returnResult() {Intent returnIntent = new Intent();// 通過(guò)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 theoriginating 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》點(diǎn)擊“返回信息”
3.實(shí)現(xiàn)過(guò)程
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;// 請(qǐng)求碼private static final int ACTIVITY_REQUEST_CODE = 1;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);init();}// 初始化private void init() {// 得到相應(yīng)控件的引用showTextView = (TextView) findViewById(R.id.show_tv);startSubActivityButton = (Button) findViewById(R.id.startSubActivity);// 注冊(cè)事件startSubActivityButton.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubstartSubActivity();}});}// 啟動(dòng)子Activity,并從中獲取返回信息private void startSubActivity() {Intent startIntent = new Intent(getApplicationContext(),SubActivity.class);startActivityForResult(startIntent, ACTIVITY_REQUEST_CODE);}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {// TODO Auto-generated method stubsuper.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;// 用于唯一標(biāo)識(shí)要返回的信息// 應(yīng)該盡量的長(zhǎng),最好加上所在類的全名,即:包名+類名+參數(shù)名public static final String RETURN_INFO = "com.demo.parameterdemo.SubActivity.info";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_sub);init();}// 初始化private void init() {// 得到相應(yīng)控件引用subEditText = (EditText) findViewById(R.id.subEditText);submitButton = (Button) findViewById(R.id.submitButton);// 注冊(cè)事件submitButton.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubreturnResult();}});}// 返回信息,執(zhí)行結(jié)束會(huì)觸發(fā)Caller的onActivityResult方法private void returnResult() {Intent returnIntent = new Intent();// 通過(guò)Intent將信息返回returnIntent.putExtra(RETURN_INFO, subEditText.getText().toString());this.setResult(RESULT_OK, returnIntent);this.finish();}}
總結(jié)
以上是生活随笔為你收集整理的从Activity返回结果的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 项目开发管理工具---GitHub(一)
- 下一篇: 使用Intent来启动Activity并