Intent
intent(意图),指明当前组件想要执行的动作,在不同组件之间传递数据。一般可被用于启动活动,启动服务,以及发动广播等场景。
intent使用分为显式和隐式两种。
显示Intent的使用
在第一个Activity代码中加入以下代码,可调用第二个Activity。
Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
//第一个参数表示上下文,第二个参数表示要启动的目标活动,这是intent的构造函数之一
startActivity(intent);
//通过intent启动目标活动
隐式Intent的使用
不明确指出想启动哪个活动,而是指定了一系列更为抽象的action和category等信息,然后交由系统分析这个Intent,并帮助找出合适的活动去启动。
在被启动的Activity的ActivityManifest.xml文件中的活动注册中加上可响应的intent的筛选条件。同时满足action和category的intent才能启动这个活动。
<activity android:name = ".SecondActivity">
<intent-filter>
<action android:name="com.example.activity.ACTION_START"/>
<category android:name="android.intent.category.DEFAULT"/>
//这个是默认的category,所有intent即使不声明也满足这个条件
<category android:name="android.intent.category.MY_CATEGORY"/>
</intent-filter>
</activity>
在要启动另一个活动的活动中设置intent,这个intent可启动有上面注册信息的活动,若一个intent寻找不到匹配的活动时,会出现ActivityNotFoundException。
Intent intent = new Intent("com.example.activity.ACTION_START");
intent.addCategory("com.example.activity.MY_CATEGORY");
startActivity(intent);
用Intent实现浏览网页、拨号等
浏览网页Intent设置
Intent intent = new Intent(Intent.ACTION_VIEW);
//Android内置,常量值为android.intent.action.VIEW
intent.setDate(Uri.prase("http://www.baidu.com"));
//将网址字符串解析成一个Uri对象,再用setData方法将Uri对象传递进去
startActivity(intent);
浏览网页ActivityManifest.xml的intent-filter设置
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:schema="http"/>
android:schema,用于指定数据的协议部分,如http
android:host,用于主机名部分。
android:port, 用于端口部分。
android:path,用于主机名和端口之后的部分,如域名之后的内容。
android:mimeType,指明可以处理的数据类型,允许用通配符等方式指定。
拨号intent设置,可直接进入拨号界面,拨打10086,tel表示拨打电话,geo表示显示地理位置。
Intent intent = new Intent(Intent.ACTION_DIAL);
intent.setData(Uri.prase("tel:10086"));
startAvtivity(intent);
用Intent传递数据,并获得返回数据
获得返回数据要调用startActivityForResult()方法,且要在被启动程序销毁后才会获得返回的数据。
第一个Activity的Intent设置
String data = "Hello SecondActivity!";
Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
intent.putExtra("extra_data",data);
//发送数据
startActivityForResult(intent,1);
//此方法可获得返回数据,第二个参数是请求码,用于判断数据来源
//也可调用startActivity()方法传送数据
第二个Activity的Intent设置
Intent intent1 = getIntent();
String data = intent.getStringExtra("extra_data");
Log.d("secondActivity",data);
//获取第一个活动传来的intent,获取其中的数据
Intent intent2 = new Intent();
intent.putExtra("data_return","Hello FirstActivity!");
setResult(RESULT_OK,intent2);
//设置intent,并将数据保存在intent中,没有任何意图
//第一个参数是结果码,第二个参数是保存数据的intent
finish();
//销毁第二个活动
在第一个活动中处理第二个活动返回的数据
在第二个活动销毁后,回调第一个活动的onActivityResult()方法
@Override
protected void onActivityResult(int requestCode,int resultCode,Intent data){
//第一个参数是请求码,判断数据来源,第二个参数是结果码,判断处理结果是否成功,
//第三个参数是获取数据的intent
switch(requestCode){
case 1:
if(resultCode == RESULT_OK){
String returnData = data.getStringExtra("data_return");
//获取数据,处理数据
}
break;
default:
}
}