android 启动子活动返回数据

在android中,一个使用startActivity启动的活动与他的父活动是不相关的,因此当他被关闭时不会提供任何反馈。
另外,可以把一个活动作为子活动启动,这样他就必然会连接到他的父活动。因此,当子活动关闭时就会触发其父活动的一个时间处理程序。对于一个活动为另一个活动提供数据输入的情况,子活动是最适合的选择。
子活动的创建方式与普通活动的创建方式相同,他必须在应用程序的清单中进行注册。任何在清单中注册过的活动都可以作为子活动打开。
  • 1.启动子活动。startActivityForResult方法的工作方式与Activity很相似,但是有一点区别。除了用来确定启动哪个活动的Intent之外,还需要一个request码。这个request码在之后子活动返回时原样传回,这样做可以使程序员区别多个子活动的返回值。下面先来看一下API中是怎么说的,很简单的几句话:
public void startActivityForResult (Intent intent, int requestCode)
Launch an activity for which you would like a result when it finished. When this activity exits, your onActivityResult() method will be called with the given requestCode. Using a negative requestCode is the same as calling startActivity(Intent) (the activity is not launched as a sub-activity).
Note that this method should only be used with Intent protocols that are defined to return a result. In other protocols (such as ACTION_MAIN or ACTION_VIEW), you may not get the result when you expect. For example, if the activity you are launching uses the singleTask launch mode, it will not run in your task and thus you will immediately receive a cancel result.
As a special case, if you call startActivityForResult() with a requestCode >= 0 during the initial onCreate(Bundle savedInstanceState)/onResume() of your activity, then your window will not be displayed until a result is returned back from the started activity. This is to avoid visible flickering when redirecting to another activity.
可以看到,当request的值小于0时,系统默认以startActivity方式启动子活动,即此时即使是以startActivityForResult方式启动,也不会有返回值输入到父活动中,所以request一定要大于或等于0。

  • 2.返回结果。当子活动结束可以关闭时,在调用finish之前调用setResult,并向调用它的父活动返回结果。
setResult有两个参数:结果吗和代表Intent结果的有效载荷。
结果码是运行子活动的结果,可以支持任意整数值,用户可以自定义,一般常用的有Activity.RESULT_OK或Activity.RESULT_CANCELED。
Intent可以包括用户想要返回的信息。

  • 3.处理子活动结果。当一个子活动关闭时,他会触发父活动的onActivityResult事件处理程序,通过重写这个方法来处理子活动的返回结果。onActivityResult接收多个参数。
请求码:即使用startActivityForResult启动时的request码,这里将其返回用于标示特定的子活动。
结果码:子活动生成的结果码,用来说明结果,即setResult中的结果码。
数据:Intent用来绑定所用返回的数据。

上面的解释应该差不多了,下面是一个网摘的例子,估计看完例子后就可以消化掉上面的东东了。
第一个activity:
package com.fatkun;
 
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.Toast;
 
public class OneActivity extends Activity {
        private final int myRequestCode = 1; //请求码
 
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Button btn = (Button)findViewById(R.id.button1);
        btn.setOnClickListener(new OnClickListener() {
 
                        public void onClick(View v) {
                                Intent intent = new Intent(OneActivity.this, OtherActivity.class);
                                //第二个参数是请求码,会在onActivityResult返回
                                startActivityForResult(intent, myRequestCode);
                        }
                });
    }
 
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
                super.onActivityResult(requestCode, resultCode, data);
                switch (requestCode) {
                case myRequestCode:
                        if (resultCode == Activity.RESULT_OK) {
                                //如果resultCode是RESULT_OK的话,就把内容显示出来。
                                Toast.makeText(this, data.getExtras().getString("info"), Toast.LENGTH_SHORT).show();
                        }
                        break;
                }
        }
}

 

第二个Activity:
package com.fatkun;
 
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;
 
public class OtherActivity extends Activity {
 
        @Override
        protected void onCreate(Bundle savedInstanceState) {
                // TODO Auto-generated method stub
                super.onCreate(savedInstanceState);
                setContentView(R.layout.other);
                Button btn = (Button) findViewById(R.id.button1);
                btn.setOnClickListener(new OnClickListener() {
 
                        public void onClick(View v) {
                                Intent intent = new Intent(OtherActivity.this, OneActivity.class);
                                intent.putExtra("info", "我是从OtherActivity返回的数据");
                                OnClickListener a = this;
                                // 这里的OtherActivity.this是为了得到OtherActivity类的对象,因为现在在button的内部类里面,this指向的是OnClickListener
                                OtherActivity.this.setResult(Activity.RESULT_OK, intent);
                                OtherActivity.this.finish(); // 结束自己
                        }
                });
        }
 
}



 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值