Android中Intent与Bundle的使用详解

软件发布|下载排行|最新软件

当前位置:首页IT学院IT技术

Android中Intent与Bundle的使用详解

发飙的蜗牛YR   2022-11-25 我要评论

Intent

Intent是Android程序中个组件之间进行交互的一种重要方式,它不仅可以指明当前组件想要执行的动作,可以指定你想要启动的活动,也可以在不同组件之间传递数据。

第一部分:通过intent来启动一个活动

Intent 分为显示和隐式

我们先来了解一下显示

其中一个常用的构造方法是:

Intent intent=new Intent(registActivity.this,showActivity.class);
//这样我们构造出了一个Intent

第一个参数为Context,要求提供一个活动的上下文(告诉这个操作你要让谁来执行)

第二个参数为class ,则表示你要启动的目标(表示你要执行哪个程序)这里是引用

通过这个构造方法,你就已经构造好了Intent意图

接下来就开始使用这个Intent意图

通过startActivity()方法启动目标这里是引用

隐式

当无法确定意图目标,即目标组件名称时,使用隐式Intent启动。通常用于启动其他应用的组件。

例如:隐式Intent启动系统默认浏览器:

//准备Intent的data属性数据
Uri uri=Uri.parse("http://www.baidu.com");
//设置Intent的action属性和data属性
Intent intent=new Intent(Intent.ACTION_VIEW,uri);
//启动目标意图
startActivity(intent);

第二部分:通过Intent向下一个活动传递数据

Intent提供了一系列putExtra()方法的重载

相当于先把我们想要传递的数据暂时存在intent中,当我们启动了另一个活动后,只需把这些数据再从Intent取出。

private void passdate()
    {
        //创建意图对象
        Intent intent=new Intent(registActivity.this,showActivity.class);
        //把数据存入intent
        intent.putExtra("name",et_name.getText().toString().trim());
        intent.putExtra("password",et_password.getText().toString().trim());
        //开启意图
        startActivity(intent);
    }

注意:通过显示意图启动了showActivity,并通过putExtra()方法传递一个字符串,putExtra()方法接收两个参数,第一个参数是键:用于后面intent中的取值,第二个参数才是我们真正想要传递的数据

//获得开启页面的意图对象
        Intent intent=getIntent();
        //根据key取出对应的value值
        String name=intent.getStringExtra("name");
        String password=intent.getStringExtra("password");
        //把用户名和密码展示到控件上(覆盖到控件的位置上)
        TextView tv_name=(TextView) findViewById(R.id.tv_name);
        TextView tv_password=(TextView) findViewById(R.id.tv_psw);
        tv_name.setText(name);
        tv_password.setText(password);
  • 首先获取上一个活动的intent对象,通过getIntent()方法获取启动showActivity的intent
  • 然后调用getStringExtra方法,传入相应的键值,就可获取传递的数据
  • 如果你想传递的是整形则getIntExtra()方法获取数据,以此类推
  • 最后,通过setText()开始执行,把我们的数据展示在控件的位置上

第三部分:返回数据给上一个活动

我们通常使用startActivityForResult()方法,这个方法也是用于启动活动,只不过他能够在活动销毁后,返回一个结果给上一个活动

 protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final EditText editText1 = (EditText) findViewById(R.id.et_name);
        Button button1 = (Button) findViewById(R.id.button);
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, showActivity.class);
                Bundle bundle = new Bundle();
                bundle.putCharSequence("name", (CharSequence) editText1.getText().toString());
                //通过bundle来保存数据
                intent.putExtras(bundle);
                startActivityForResult(intent, 1);//和startActivity很像,就多了个请求码用于后面判断数据来源
            }
        });

startActivity()方法接收两个参数,第一个参数是Intent,第二个参数是请求码,用于之后回调判断数据来源

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_show);
       final EditText editText2= (EditText) findViewById(R.id.show_name);
        Button button2=(Button) findViewById(R.id.show_button);
        //获取上个活动的intent和bundle
        Intent intent=getIntent();
        Bundle bundle=intent.getExtras();
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent=new Intent(showActivity.this,MainActivity.class);
                Bundle bundle=new Bundle();
                bundle.putCharSequence("edit",(CharSequence) editText2.getText().toString());
                intent.putExtras(bundle);
                //setResult方法用于给上一个活动传递数据,第一个参数是返回上一个活动的结果,第二个参数是将带有数据的intent传过去
                setResult(1,intent);
                finish();
            }
        });
    }

在showActiviity活动中,也构建了一个Intent,这个Intent是用来传递数据,

通过调用setResult()方法专门给上一个活动返回数据,setResult()方法接收两个参数,第一个参数:用于向上一个活动返回处理结果,一般使用RESULT_OK或RESULT_CANCELED两个值,第二个参数则将带有数据的Intent传递回去,最后通过finish()销毁当前的活动

//在showActivity中的finish被销毁后,会回调上 一个活动的onActivityResult()方法,因此我们要在MainActivity里重写这个方法
@Override
//requestCode就是我们启动时传入的请求码,resultCode是返回数据时传入的,data携带返回数据的intent
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        switch (requestCode) {
            case 1:
                if (resultCode == RESULT_FIRST_USER) {//通过请求码来判断数据的来源
                    et_name = (EditText) findViewById(R.id.et_name);
                    et_name.setText(data.getStringExtra("edit"));//从data中取值并输出
                    //通过getStringExtra来获取传递的数据
                }
                break;
            default:
        }
    }

由于我们是使用startActivity()方法来启动SecondActivity的,在SecondActivity被销毁后就会回调上一个活动的onActivityResult()方法,所以我们要在上一个活动中重写这个方法得到返回数据。

OnActivityResult()方法带有三个参数,=第一个参数requestCode,启动活动的请求码,第二个参数resultCode,返回数据的处理结果,第三个参数,携带返回数据的intent,由于一个活动有可能会调用startActivityForResult()去启动很多不同的活动,每一个活动都会返回数据回调onActivityResult()这个方法,所以为了安全一般使用Switch语句来进行判断

通过resquestCode判断数据来源,resultCode判断处理结果是否成功,最后通过data中取值并打印出来

android中Intent和Bundle之间的关系

打个比方: 中国向美国海运箱装的水果

中国就是Activity1,美国是Activity2, 海运则是 Intent,装水果的箱子则是bundle,箱子上的编号就时key,水果就时data。

中国通过new一个intent对象指定意图为 海运到美国 ,通过putExtras把箱装的水果放至海运的路上。

美国先要通过getIntent的方法获取海运的对象,然后通过getExtras获得箱子,再根据箱子上的编号获得水果。

如果Intent传递的数据只有一个,那么就直接用Intent的putExtra()方法直接放进参数即可。那如果Intent需要传递的是好几个参数,或者是一个类,那么这时候就需要用到Bundle

Copyright 2022 版权所有 软件发布 访问手机版

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 联系我们