intent消息传递

作用

给各个服务传递消息

分类2类

Intent(Context packageContext, Class)

这个构造函数接收两个参数,第一个参数Context 要求提供一个启动活动的上下文,第二个参数Class 则是指定想要启动的目标活动,通过这个构造函数就可以构建出Intent 的“意图”。

类似传递工具,将当前启动活动,目标下一个启动活动,作为构造函数的参数,生成一个intent对象。
通过startActivity方法启动这个链接器,启动目标活动。

Activity类中提供了一个startActivity() 方法,这个方法是专门用于启动活动的,它接收一个Intent 参数

显式传递
1
2
3
4
5
6
7
8
9
10
11
12
Button button2 = findViewById(R.id.button_2);
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
// 显式 Intent
// 指定传递目标
Intent intent = new Intent(MainActivity.this,SecondActivity.class);


startActivity(intent);
}
隐式传递
1
2
3
4
5
6
7
8
9
10
11
12
13
Button button2 = findViewById(R.id.button_2);
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {

// 隐式传递
// 依据AndroidMainifest.xml中定义的条件所筛选
// 指定action包含ACTION_START
// 添加指定category 有自定义MY_CATEGORY
Intent intent = new Intent("com.example.helloworld.ACTION_START");
intent.addCategory("com.example.helloworld.MY_CATEGORY");
startActivity(intent);
}
调用组件传递

通过view和dial等不同组件,传递不同功能的数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Button button2 = findViewById(R.id.button_2);
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {

// 传递用view方式,调用的形式是网页
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.baidu.com"));


// 专递多的是电话,调用号码
Intent intent = new Intent(Intent.ACTION_DIAL);
intent.setData(Uri.parse("tel:10086"));


startActivity(intent);
}

指定了Intent的action 是Intent.ACTION_VIEW ,这是一个Android系统内置的动作,其常量值为android.intent.action.VIEW 。然后通过Uri.parse() 方法,将一个网址字符串解析成一个Uri 对象,再调用Intent的setData() 方法将这个Uri 对象传递进去。

传递数值

Activity之间正向传输数据

递送端

1
2
3
4
5
6
7
8
9
10
11
//设定传送数值
String data = "传递数值1";

//新建消息传递,设定当前与目标
Intent intent = new Intent(MainActivity.this,ThirdActivity.class);

//设定传递信息,key value方式
intent.putExtra("extra_data",data);

//设定请求识别代码
startActivity(intent);

接受端

1
2
3
4
5
6
7
8
//新建传送,根据传送端设定的key获取值,通过提示框显示
Intent intent = getIntent();
String data = intent.getStringExtra("extra_data");
Toast.makeText(
ThirdActivity.this,
data ,
Toast.LENGTH_SHORT
).show();
Activity之间反向传输数据

从接受端传输给发送端并销毁自身

  • 发送端
1
2
3
4
5
6
7
//startActivityForResult() 方法接收两个参数,第一个参数还是Intent,第二个参数是请求码,用于在之后的回调中判断数据的来源

//如参数2 > = 0,当Activity结束时requestCode将归还在onActivityResult()中。确定返回的数据是从哪个Activity中返回,用来标识目标Activity。

//建立一个互动传递,并设定标识Activity值
Intent intent = new Intent(MainActivity.this,ThirdActivity.class);
startActivityForResult(intent,1);
  • 接受端
1
2
3
4
5
6
7
8
9
// 建立专递,设定活动传递,并设定改活动要传递的值,设定活动要传递的位置是前一个Activity,并且这个Activity专递过来是状态OK,同时将这个值也设定,并送出。
// 销毁自身

// setResult() 方法接收两个参数,第一个参数用于向上一个活动返回处理结果,一般只使用RESULT_OK 或RESULT_CANCELED 这两个值,第二个参数则把带有数据的Intent传递回去

Intent intent = new Intent();
intent.putExtra("data_return","这是返回的值");
setResult(RESULT_OK,intent);
finish();
  • 发送端
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// 重写Activity的获取状态方法,判断requestCode,判断是否为启动时传出的设定值
// 判断处理是否成功,都符合后显示


// onActivityResult() 方法带有三个参数,第一个参数requestCode ,即我们在启动活动时传入的请求码。第二个参数resultCode ,即我们在返回数据时传入的处理结果。第三个参数data ,即携带着返回数据的Intent。

@Override
protected void onActivityResult(int requestCode,int resultCode,Intent data) {
switch (requestCode) {
case 1:
if(resultCode == RESULT_OK){
String returnedData = data.getStringExtra("data_return");
Toast.makeText(
MainActivity.this,
returnedData,
Toast.LENGTH_SHORT
).show();
}
break;
default:
}
}