Android中Intent与Bundle的使用详解

目录
  • Intent
  • android中Intent和Bundle之间的关系

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

到此这篇关于Android中Intent与Bundle的使用详解的文章就介绍到这了,更多相关Android Intent与Bundle内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Android入门之IntentService的使用教程详解

    目录 开篇 IntentService 课程目标 代码核心设计 service注册 Service类-LongWaitingService 主类-MainActivity.java 运行效果 开篇 在前一篇中我们讲了bindService的使用.并且我们留下了一个念想,即在bindService取值时故意阻塞30秒,引起了一次ANR并引出了今天的章节-IntentService. IntentService的生命周期中有一个非常好的方法-onHandleIntent方法,它是一个abstract

  • Android Intent传递大量数据出现问题解决

    目录 正文 异常TransactionTooLargeException Intent携带信息的大小受Binder限制 为什么Binder要限制传输数据的大小 替代方案 正文 官方文档 https://developer.android.google.cn/guide/components/activities/parcelables-and-bundles 在sendBroadcast,startActivity时,我们会用到Intent. Intent可以携带一些数据,比如基本类型数据int

  • 关于Android Activity之间跳转问题(Intent)

    当一个Acitivity需要启动另一个Activity时,通过Intent来表达自己的意图,告知系统启动哪个Activity. private ImageButton i2; i2=findViewById(R.id.i2); i2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent=new Intent(UserActivity.this,Us

  • Android开发Intent跳转传递list集合实现示例

    目录 引言 传递list集合 传递ArrayList集合 传递实体类 传递String 引言 Android 两个activity之间普通传值 如:单个String ,int ... 就不多说了 参考文章 https://www.jb51.net/article/257178.htm 传递list集合 注意:list传值的实体类用序列化 先创建个实体类(等下测试用) import java.io.Serializable; //别忘了序列化 Serializable public class D

  • Android显式Intent与隐式Intent的使用详解

    目录 什么是Intent 一.显式Intent和隐式Intent 1.显式Intent (1)在Intent构造函数中指定 (2)调用意图对象的setClass方法指定 (3)调用意图对象的setComponent方法指定 2.隐式Intent 什么是Intent Intent是各个组件之间信息沟通的桥梁,它用于Android各组件之间的通信,主要完成下列工作: 标明本次通信请求从哪里来.到哪里去.要怎么走. 发起方携带本次通信需要的数据内容,接收方从收到的意图中解析数据. 发起方若想判断接收方

  • Android中FileProvider的各种场景应用详解

    目录 前言 一.常规使用与定义 二.能不能自定义接收文件? 三.能不能主动查询对方的沙盒? 总结 前言 有部分同学只要是上传或者下载,只要用到了文件,不管三七二十一写个 FileProvider 再说. 不是每一种情况都需要使用 FileProvider 的,啥?你问行不行?有没有毛病? 这... 写了确实可以,没毛病!但是这没有必要啊. 如果不需要FileProvider就不需要定义啊,如果定义了重复的 FileProvider,还会导致清单文件合并失败,需要处理冲突,从而引出又一个问题,解决

  • Android 中Fragment与Activity通讯的详解

    Android 中Fragment与Activity通讯的详解 与activity通讯 尽管fragment的实现是独立于activity的,可以被用于多个activity,但是每个activity所包含的是同一个fragment的不同的实例. Fragment可以调用getActivity()方法很容易的得到它所在的activity的对象,然后就可以查找activity中的控件们(findViewById()). 例如: ViewlistView =getActivity().findView

  • Android中asset和raw的区别详解

    *res/raw和assets的相同点: 1.两者目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制. *res/raw和assets的不同点: 1.res/raw中的文件会被映射到R.java文件中,访问的时候直接使用资源ID即R.id.filename:assets文件夹下的文件不会被映射到 R.java中,访问的时候需要AssetManager类. 2.res/raw不可以有目录结构,而assets则可以有目录结构,也就是assets目录下可以再建立文件夹 *读取文件资源

  • Android 中Lambda表达式的使用实例详解

     Android 中Lambda表达式的使用实例详解 Java8 中着实引入了一些非常有特色的功能,如Lambda表达式.streamAPI.接口默认实现等等.Lambda表达式在 Android 中最低兼容到 Android2.3 系统,兼容性还是不错的,Lambda表达式本质上是一种匿名方法,它既没有方法名,也没有访问修饰符和返回值类型,使用它编写的代码将更加简洁易读. 1.Lambda表达式的基本写法 如果想要在 Android 项目中使用 Lambda表达式 或者 Java8 的其他新特

  • Android中判断网络是否连接实例详解

    Android中判断网络是否连接实例详解 在android中,如何监测网络的状态呢,这个有的时候也是十分重要的,方法如下: public class ConnectionDetector { private Context _context; public ConnectionDetector(Context context){ this._context = context; } public boolean isConnectingToInternet(){ ConnectivityMana

  • Android中关于Notification及NotificationManger的详解

    Android状态栏提醒 在Android中提醒功能也可以用AlertDialog,但是我们要慎重的使用,因为当使用AlertDialog的时候,用户正在进行的操作将会被打断,因为当前焦点被AlertDialog得到.我们可以想像一下,当用户打游戏正爽的时候,这时候来了一条短信.如果这时候短信用AlertDialog提醒,用户必须先去处理这条提醒,从而才能继续游戏.用户可能会活活被气死.而使用Notification就不会带来这些麻烦事,用户完全可以打完游戏再去看这条短信.所以在开发中应根据实际

  • Android中Serializable和Parcelable序列化对象详解

    本文详细对Android中Serializable和Parcelable序列化对象进行学习,具体内容如下 学习内容: 1.序列化的目的 2.Android中序列化的两种方式 3.Parcelable与Serializable的性能比较 4.Android中如何使用Parcelable进行序列化操作 5.Parcelable的工作原理 6.相关实例  1.序列化的目的 1).永久的保存对象数据(将对象数据保存在文件当中,或者是磁盘中 2).通过序列化操作将对象数据在网络上进行传输(由于网络传输是以

  • Android中TelephonyManager类的用法案例详解

    本文以案例形式分析了Android中TelephonyManager类的用法.分享给大家供大家参考.具体如下: 目录结构: main.xml布局文件: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="ve

  • Android中Messenger原理及基本用法详解

    这边博客主要记录一下Android中Messenger的基本原理和用法. 简单来讲,Messenger其实就是Binder通信的包装器,是一种基于消息传递的进程间通信工具. //Messenger实现了Parcelable接口,因此可以跨进程传输 public final class Messenger implements Parcelable { ............... } 通常情况下,我们可以在A进程中创建一个Messenger,然后将该Messenger传递给B进程. 于是,B进

  • Android中使用HTTP服务的用法详解

    在Android中,除了使用Java.NET包下的API访问HTTP服务之外,我们还可以换一种途径去完成工作.Android SDK附带了Apache的HttpClient API.Apache HttpClient是一个完善的HTTP客户端,它提供了对HTTP协议的全面支持,可以使用HTTP GET和POST进行访问.下面我们就结合实例,介绍一下HttpClient的使用方法. 我们新建一个http项目,项目结构如图: 在这个项目中,我们不需要任何的Activity,所有的操作都在单元测试类H

随机推荐