Intent传递消息
Intent是各个组件之间信息沟通的桥梁,主要完成3部分工作:
- Intent表明本次通信请求从哪来到哪去,要怎么走。
- 发起方携带本次通信需要的数据内容,接收方对收到的Intent数据进行解包。
- 如果发起方要求判断接收方的处理结果,Intent负责让接收方传回响应的数据内容
表达Intent有两种方式,一种是显式Intent,一种是隐式Intent。
显式Intent
声明一个Intent对象时需要指定两个参数,第一个参数为源页面,第二个参数为目标页面
1.在构造函数中指定:
Intent intent = new Intent(this,TargetActivity.class);
2.调用setClass方法指定:
Intent intent = new Intent();
intent.setClass(this, TargetActivity.class);
3.调用setComponent方法指定:
Intent intent = new Intent();
ComponentName component = new ComponentName(this, TargetActivity.class);
intent.setComponent(component);
隐式Intent
没有明确指定要跳转的类名,只给出一个动作让系统匹配有相同定义的目标
Intent intent = new Intent();
intent.setAction("a");
intent.addCategory("b");
startActivity(intent);
系统根据Action、Category等属性寻找目标
在AndroidManifest.xml里的intent-filter过滤器配置
<activity>
<intent-filter>
<action android:name="a"/>
<category android:name="b"/>
<category android:name="android.intent.category.DEFAULT"/> <!--此句一般都要加 -->
<data android:scheme="..." android:host="..." android:path="/..." android:type="..."/>
</intent-filter>
</activity>
Android入门:隐式Intent_xiazdong的博客-优快云博客
Bundle快递包裹
Intent重载了很多putExtra方法传递各类型的参数,为了方便管理,Android引入Bundle概念,大小包裹由Bundle统一存取。
Bundle内部用于存放数据的结构是Map映射,存取只需调用putExtras方法和getExtras方法。
//存包裹
Intent intent = new Intent(MainActivity.this, FirstActivity.class);
Bundle bundle = new Bundle();
bundle.putString("name", "张三");
bundle.putInt("age", 30);
intent.putExtras(bundle);
startActivity(intent);
//----------------------------------------
//取包裹
Intent intent = getIntent();
Bundle bundle = intent.getExtras();
String name = bundle.getString("name", "");
int age = bundle.getInt("age", 0);
实战开发:Activity请求与响应
页面1:发送消息给页面2
页面2:收到的页面1请求信息
页面1:页面2的响应信息
页面1 Activity:
public void onClick(View v) {
if (v.getId() == R.id.btn_request) {
//创建一个新意图
Intent intent = new Intent();
//设置意图要跳转的活动类
intent.setClass(this, responseActivity.class);
//获取当前系统时间
SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss");
Date curDate = new Date(System.currentTimeMillis());
//存入request_time字符串
intent.putExtra("request_time", formatter.format(curDate));
//存入request_content字符串
intent.putExtra("request_content", et_request.getText().toString());
startActivityForResult(intent, 0);
}
}
protected void onActivityResult(int requestCode,int resultCode,Intent data){
super.onActivityResult(requestCode, resultCode, data);
if (data!=null){
//从意图中取出response_time字符串
String response_time = data.getStringExtra("response_time");
//从意图中取出response_content字符串
String response_content = data.getStringExtra("response_content");
String desc = String.format("收到返回消息:\n应答时间为:%s\n应答内容为:%s",
response_time,response_content);
tv_request.setText(desc);
}
}
页面2 Activity
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_response);
findViewById(R.id.btn_response).setOnClickListener(this);
et_response = findViewById(R.id.et_response);
tv_response = findViewById(R.id.tv_response);
//从上个页面中取出包裹
Bundle bundle = getIntent().getExtras();
//从包裹中取出request_time字符串
String request_time = bundle.getString("request_time");
//从包裹中取出request_content字符串
String request_content = bundle.getString("request_content");
String desc = String.format("收到请求消息:\n请求时间为:%s\n请求内容为:%s",
request_time,request_content);
tv_response.setText(desc);
}
@Override
public void onClick(View v) {
if(v.getId()==R.id.btn_response){
Intent intent = new Intent();
Bundle bundle = new Bundle();
SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss");
Date curDate = new Date(System.currentTimeMillis());
bundle.putString("response_time", formatter.format(curDate));
bundle.putString("response_content", et_response.getText().toString());
intent.putExtras(bundle);
setResult(Activity.RESULT_OK, intent);
//关闭当前页面
finish();
}
}
以上仅为部分代码