目录
- 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