android.app.Activity类中的startActivityForResult()方法、onActivityResult()方法、setResult()方法的使用

Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将Intent传递给调用的组件,并完成组件的调用
Intent,又称为意图,是一种运行时绑定机制,它能在程序运行的过程中链接两个不同的组件(Activity、Service、BroadcastReceiver)。通过Intent,程序可以向Android表达某种请求或意愿,Android会根据意愿的内容选择适当的组件来请求。

在这些组件之间的通讯中,主要是由Intent协助完成的。Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将Intent传递给调用的组件,并完成组件的调用。因此,Intent在这里起着一个媒体中介的作用,专门提供组件互相调用的相关信息,实现调用者与被调用者之间的解耦。
通过Intent请求Activity,必须在AndroidManifest.xml文件中对被请求的Activity新增标签配置,否则会导致错误。

Intent一般包含两个主要信息,action、data。
action:表示这个Intent此次操作的动作。
data:表示这次动作涉及的数据。

下面通过一个例子来展示Activity中使用Intent导向新Activity并传递数据。此程序仅在两个页面之间相互跳转,但是每次跳转会创建新的Activity,所以在startActivity()之后需要调用finish()销毁当前Activity,如果不销毁,多次跳转后,程序的Activity栈中会存放多个Activity,点击设备的返回按钮,会发现会一直向后退。 



在启动另外一个Activity的时候,有两种方法:

一种是直接使用startActivity,

另外一种就是使用startActivityForResult。

前一种想必大家都明白怎么使用了,我就不废话了。

下面主要通过一个Demo来学习一下第二种:

startActivityForResult的主要作用就是它可以回传数据,假设我们有两个页面,首先进入第一个页面,里面有一个按钮,用于进入下一个页面,当进入下一个页面时,进行设置操作setResult(),并在其finish()动作或者back动作后,将设置的值回传给第一个页面,从而第一个页面来显示所得到的值。这个有一点像回调方法,就是在第二个页面finish()动作或者back动作后,会回调第一个页面的onActivityResult()方法,所以我们可以重写一下这个方法。代码:

第一个页面代码:

package org.dengqiong;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;


public class TestStartActivityForResultActivity extends Activity implements
OnClickListener {
private TextView mText01;
private TextView mText02;
private Button button01;
private Button button02;
private Intent mIntent;
private int requestCode;


/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mText01 = (TextView) findViewById(R.id.mText01);
mText02 = (TextView) findViewById(R.id.mText02);
button01 = (Button) findViewById(R.id.mButton01);
button02 = (Button) findViewById(R.id.mButton02);
button01.setOnClickListener(this);
button02.setOnClickListener(this);
mText01.setText("01");
mText02.setText("02");


mIntent = new Intent();
mIntent.setClass(TestStartActivityForResultActivity.this,
Activity02.class);
}


@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.mButton01:
// 请求码的值随便设置,但必须>=0,当requestCode 大于0时才可以触发onActivityResult()
requestCode = 0;
startActivityForResult(mIntent, requestCode);

break;
case R.id.mButton02:
requestCode = 2;
startActivityForResult(mIntent, requestCode);

break;
default:
break;
}
}


// 回调方法,从第二个页面回来的时候会执行这个方法(可以获得第二个页面设置的数据setResult()
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
String change01 = data.getStringExtra("change01");
String change02 = data.getStringExtra("change02");
// 根据上面发送过去的请求码来区别
switch (requestCode) {
case 0:
mText01.setText(change01);
break;
case 2:
mText02.setText(change02);
break;
default:
break;
}
}
}


第一个页面布局文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView  
    android:id="@+id/mText01"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    />
<TextView  
    android:id="@+id/mText02"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    />
<Button 
    android:id="@+id/mButton01"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"
    android:text="改变第一行文本的值"
/>
<Button 
    android:id="@+id/mButton02"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"
    android:text="改变第二行文本的值"
/>
</LinearLayout>


第二个页面代码:

package org.dengqiong;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;

public class Activity02 extends Activity {
private int resultCode = 0;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity02);
Intent mIntent = new Intent();
mIntent.putExtra("change01", "1000");
mIntent.putExtra("change02", "2000");
// 设置结果,并进行传送
this.setResult(resultCode, mIntent);
// this.finish();
}

}


第二个页面布局文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView  
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="文本的值已经改变"
    />
</LinearLayout>


配置文件:

AndroidManifest.xml: 

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="org.sunchao"
      android:versionCode="1"
      android:versionName="1.0">
    <uses-sdk android:minSdkVersion="8" />


    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".TestStartActivityForResultActivity"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".Activity02" />


    </application>
</manifest>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值