intent是android程序中各个组件之间进行交互的一种重要方式,它不仅可以指明当前组件想要执行的组件,而且还可以传递数据。Intent一般用户启动活动,广播,服务等场景。
Intent分为显示Intent和隐式Intent:
1,显示Intent
Intent有多个构造方法,其中一个方法Intent(Context packageContext,Class
//secondActivity.class就是我们要启动的目标activit
Intent intent = new Intent(MainActivity.this,SecondActivity.class);
startActivity(intent);
2.隐式Intent
相对于显示Intent,隐式Intent就显示稍微复杂一点了,他需要在标签下配置来指定一系列的action和category等消息:
<activity android:name=".the_first_line_of_code.chapter_two.SecondActivity">
<intent-filter>
<action android:name="com.example.activitytest.Action_START" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="com.example.activitytest.MY_CATEGORY" />
</intent-filter>
</activity>
只有action和category同时匹配,才能响应该Intent,所以启动代码如下:
Intent intent1 = new Intent("com.example.activitytest.Action_START");
//android.intent.category.DEFAULT是一种默认category,在调用startActivity()会自动添加进去
intent1.addCategory("com.example.activitytest.MY_CATEGORY");
startActivity(intent1);
3,更多Intent的用法
//1.打开网页
Intent intent0 = new Intent(Intent.ACTION_VIEW);
intent1.setData(Uri.parse("http://ww.baidu.com"));
startActivity(intent0);
//2.打电话
Intent intent2 = new Intent(Intent.ACTION_DIAL);
intent1.setData(Uri.parse("tel:10086"));
startActivity(intent2);
<data>标签中主要可以配置一下内容
// android:scheme //指定协议部分如http 表示网页协议,geo地理位置协议tel表示拨打电话
// android:host // 指定主机名 如www.baidu.com
// android:port:// 指定端口号 一般跟随主机名后面
// android:path // 主机和端口之后的部分
// android:mimeType: // 可以处理数据的类型,允许使用通配符
// 只有当<data>标签和intent中携带完全一致时,当前活动才能够相应intent
4.向下一个活动传递数据
//传递数据
Intent intent = new Intent(IntentActivity.this, LoginActivity.class);
intent.putExtra("data_key","hello");//传递的数据类型
startActivity(intent);
//接受数据
Intent intent5 = getIntent();
String data_key = intent5.getStringExtra("data_key");//接受数据类型
5.当第二个活动销毁的时候,我们希望返回数据给上一个活动,于是可以通过startActivityForResult()启动活动,第二个参数为请求码:
//启动loginActivity
Intent intent = new Intent(IntentActivity.this, LoginActivity.class);
intent.putExtra("data_key","hello");//传递的数据类型
startActivityForResult(intent,REQUEST_CODE);
//结果回调
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if(requestCode == REQUEST_CODE){//请求码
if(resultCode == RESULT_OK){//结果码
String returnData = data.getStringExtra("data_return");
Log.d("firstActivity", returnData);
}
}
super.onActivityResult(requestCode, resultCode, data);
}
//loginActivity设置回传的数据
Intent intent = new Intent();
intent.putExtra("data_return","hello");//传递的数据类型
setResult(RESULT_OK,intent4);//RESULT_OK 结果码
}
//如果按back键,也应该处理
@Override
public void onBackPressed() {
Intent intent4 = new Intent();
intent4.putExtra("data_return","hello firstActivity");
setResult(RESULT_OK,intent4);//RESULT_OK 结果码
}