Activity的跳转和数据传递

本文介绍了Android中Activity的跳转方式,包括显示跳转和隐式跳转,并详细讲解了如何在Activity之间传递数据,利用Bundle进行数据绑定。此外,还讨论了startActivityForResult()用于启动Activity并获取返回结果的机制,以及如何处理返回的数据。
摘要由CSDN通过智能技术生成

显示跳转和隐式跳转

  • 显示跳转
  public void onClick(View view) {
                //Intent intent = new Intent();
                //显式1
                //intent.setClass(AActivity.this,BActivity.class);
                //显式2
                //intent.setClassName(AActivity.this,"com.example.test.jump.BActivity");
                //显式3
                //intent.setComponent(new ComponentName(AActivity.this,"com.example.test.jump.BActivity"));
                //显式4,最常用
                Intent intent = new Intent(AActivity.this,BActivity.class);
                startActivity(intent);
                
            }
  • 隐式跳转
  1. 在activity.java中如下设置,记住setAction中的字符串
Intent intent = new Intent()
intent.setAction("com.b.jump");
startActivity(intent);
  1. 在AndroidManifest文件中要跳转到的目标activity标签中添加如下子标签,action中的name属性值就是之前setAction中写的那个。category的name值也要做如下修改
<intent-filter>
     <action android:name="com.b.jump" />
     <category android:name="android.intent.category.DEFAULT" />
</intent-filter>

intent.setAction还可以调用一些系统的组件,比如打电话,发邮件,摄像头等等

activity之间的数据传递

  • 数据的绑定:Bundle类
    通过put对应的方法绑定数据,数据是键值对的形式绑定的,绑定的数据可以是各种类型string/int/数组等等,比如
    void putString( String key,String value);
    void putInt( String key, int value) ;
  • bundle设置到intent
    1. intent.putExtra(key,value): 给bundle绑定一个key,键值对的形式放进去,相应的读取时就用intent.getExtra(key)
    2. inten.putExtras(bundle):这样可以直接放bundle进去,读取的时候就用intent.getExtras()方法
 //绑定数据
                Bundle bundle = new Bundle();
                bundle.putString("name","德华");
                bundle.putInt("age",18);
                //将bundle放进intent中
                intent.putExtras(bundle);
                startActivity(intent);
  • 数据的读取
    读取的方法根据绑定的时候用的方法来
 Button btnB = findViewById(R.id.btn_b);
        //获取intent
        Intent intent = getIntent();
        //获取bundle
        Bundle bundle = intent.getExtras();
        //获取绑定数据
        String name = bundle.getString("name");
        int age = bundle.getInt("age");

startActivityForResult:启动Activity,结束后返回结果

前面的是跳转时绑定数据,而这里是按返回键时绑定数据到另一个页面,不同的需求。

  • startActivityForResult(Intent, int)

    第一个参数Intent,和普通的startActivity()里的Intent一样,里面放要请求的Activity和可能需要放的数据。

    第二个参数int,是一个请求代码,整型的,这个可以自己随便定义,但这个数要大于等于0才行。因为MainActivity有可能会跳转到多个页面,如果这几个页面使用完之后,都需要返回一些信息,那么就必须要有个标识符来表示返回来过的是哪个页面的信息。

  • setResult(int),setResult(int, Intent)

    第一个参数int,是一个返回代码,整型的,这个也是自己随便定义,用来表示这个页面执行之后是个什么情况,是成功还是失败了,还是其它什么的,反正返回一个整型数,自己知道它的含义就行了。这个数据在Activity类中有常量可以用。

    第二个可选参数是一个Intent,可以用来存放数据。

  • void onActivityResult(int requestCode, int resultCode, Intent data)
    这个方法是请求的Activity完成任务被finish()之后,会调用这个,前提是,你启动那个Activity是通过startActivityForResult()来启动的。
    第一个参数int,是请求代码,就是startActivityForResult()里面的请求代码。
    第二个参数int,是返回代码,就是setResult()方法里面的设置的参数。
    第三个参数Intent,就是setResult(int, Intent)里面的放置数据的Intent。

案例

  • AActivity初始页面:
package com.example.test.jump;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

import android.content.ComponentName;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

import com.example.test.R;
import com.example.test.util.ToastUtil;

public class AActivity extends AppCompatActivity {
    private Button btnA;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_a);
        btnA = findViewById(R.id.btn_a);
        btnA.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //Intent intent = new Intent();
                //显式1
                //intent.setClass(AActivity.this,BActivity.class);
                //显式2
                //intent.setClassName(AActivity.this,"com.example.test.jump.BActivity");
                //显式3
                //intent.setComponent(new ComponentName(AActivity.this,"com.example.test.jump.BActivity"));
                //显式4,最常用
//                Intent intent = new Intent(AActivity.this,BActivity.class);
                 //隐式跳转,需要在AndroidManifest文件中配置
                Intent intent = new Intent();
                intent.setAction("com.b.jump");
                //绑定数据
                Bundle bundle = new Bundle();
                bundle.putString("name","德华");
                bundle.putInt("age",18);
                //将bundle放进intent中
                intent.putExtras(bundle);
                // startActivity(intent);
                //另一种跳转方式,附带请求码,等转发过去的页面finish的时候绑定的数据也会带着这个码,就知道数据是要传给这个页面的
                startActivityForResult(intent,0);

            }
        });
    }
/**
     * 当跳转到的页面finish时就会触发这个方法,在里面可以得到传过来的数据
     */
    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        ToastUtil.showMsg(AActivity.this,data.getExtras().getString("B"));
    }
}

  • BActivity:跳转到的页面
package com.example.test.jump;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

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

import com.example.test.R;
import com.example.test.util.ToastUtil;

public class BActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R. layout.activity_b);
        Button btnB = findViewById(R.id.btn_b);
        //获取intent
        Intent intent = getIntent();
        //获取bundle
        Bundle bundle = intent.getExtras();
        //获取绑定数据
        String name = bundle.getString("name");
        int age = bundle.getInt("age");
        ToastUtil.showMsg(BActivity.this,"A中绑定的数据:"+name+":"+age);

        btnB.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View view) {
                Intent intent = new Intent();
                Bundle bundle1 = new Bundle();
                bundle1.putString("B","B中绑定的数据");
                intent.putExtras(bundle1);
                setResult(Activity.RESULT_OK,intent);
                //finish用于结束Activity的生命周期,会调用onDestroy方法.其结果和用户按下返回键是一样的
                finish();
            }
        });
    }

}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这个实验描述了Activity之间的另外一种切换方式,通常Activity的切换方式是Activity1通过startActivity切换到Activity2, Activity2再通过startActivity切换到其他的Activity,但是有的候我们需要启动一个新的Activity获取用户的输入,然后返回到原来的Activity,比如activity是一个通讯录列表,我们通过一个增加按钮打开另一个activity让用户输入新的联系人,输入后再返回通讯录列表。 这个候,我们可以通过startActivityForResult(Intent, int)方法启动新的Activity,新的Activity通过setResult(int, Intent)方法返回老的Activity,这个候会触发老的Activity的onActivityResult(int, int, Intent)方法,我们可以在这个方法的实现中处理返回事件。 startActivityForResult(Intent, int),其中int为Request Code,也是onActivityResult的第一个参数,通常一个Activity不仅仅只触发一个获取事件,比如上面提到的通讯录,可能会有一个增加联系人的事件,也可能会有一个修改联系人或给指定联系人增加一个电话的事件,但我们只有一个onActivityResult方法,所以我们需要这么一个Request Code区分是哪个事件的返回,这个值是用户自己定义的,而且完全是用户自己进行管理,很人性化。 setResult(int, Intent),其中的int是Result Code,它表示的是返回的状态,也是onActivityResult的第二个参数。这个参数需要特别注意一下,android为这个值提供了三个默认的常量。我们先看前两个,RESULT_CANCELED和RESULT_OK,这个从字面上很好理解,一个是运行取消,另一个是运行成功返回,当用户按BACK键,Result Code就是RESULT_CANCELED。但我们看看他们分别对应的值,就会发现奇怪的地方,RESULT_CANCELED=0,RESULT_OK=-1!!!在其他系统中OK通常都是1,而在android,它是-1,这是为什么呢,来让我们看看第三个默认的常量,RESULT_FIRST_USER=1,明白了吧!android把所有大于0的数字都留给了用户自己,多么人性化啊!但是要注意了,如我前面所说,大部分系统都喜欢将大于0作为正确返回,小于0作为错误返回,所以很多人(包括我),喜欢用if(result > 0)表示返回成功,这个在android是不通行的,一定要特别注意!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值