Android中Intent与Bundle的使用详解
作者:发飙的蜗牛YR
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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!