从Activity返回结果
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" ><TextViewandroid:id="@+id/show_tv"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="在這里顯示子Activity返回的內容" /><Buttonandroid: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" ><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》輸入要返回的信息
當準備好返回時,可以在調用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 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》點擊“返回信息”
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;@Overrideprotected 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() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubstartSubActivity();}});}// 啟動子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;// 用于唯一標識要返回的信息// 應該盡量的長,最好加上所在類的全名,即:包名+類名+參數名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() {// 得到相應控件引用subEditText = (EditText) findViewById(R.id.subEditText);submitButton = (Button) findViewById(R.id.submitButton);// 注冊事件submitButton.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubreturnResult();}});}// 返回信息,執行結束會觸發Caller的onActivityResult方法private void returnResult() {Intent returnIntent = new Intent();// 通過Intent將信息返回returnIntent.putExtra(RETURN_INFO, subEditText.getText().toString());this.setResult(RESULT_OK, returnIntent);this.finish();}}
總結
以上是生活随笔為你收集整理的从Activity返回结果的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 项目开发管理工具---GitHub(一)
- 下一篇: 使用Intent来启动Activity并