Intent 一般可被用于启动活动、启动服务及发送广播等场景,还可用于组件间传递数据。
Activity类提供一个startActivity()方法,专门用于启动活动,接收一个Intent参数。Activity调用startActivity()方法,调用请求实际是发送给了操作系统的ActivityManager,ActivityManager负责创建Activity实例
一、显式Intent的使用
intent在同一个app的两个activity之间进行切换,通常是定义一个显式(explicit)的intent,明确指定了需要启动组件的类名。
Intent exlipcitIntent = new Intent(IntentActivity.this, ExplictActivity.class);
startActivity(exlipcitIntent);
二、隐式Intent的使用
当想要唤起不同的app来执行某个动作,则必须使用隐式(implicit)的intent,不明确指出所要启动的活动,而是指定一系列抽象的action和category等信息,然后交由系统去分析这个Intent,找出合适的活动去启动。
action标签中指明当前活动可响应的动作,category标签更精确指明
当前活动能够响应的Intent中可能带有的category。当action和category中的内容能够匹配Intent中指定的action和category时,这个活动才能响应该Intent。
在AndroidManifest.xml文件中为所想要启动的活动配action、category 等,然后再java代码中启动即可。例如,FirstActivity 中某个组件启动SecondActivity.
<activity android:name=".ActionActivity">
<intent-filter>
<action android:name="com.developer.ghhf.intentdemo.START"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.MY_CATEGORY"/>
</intent-filter>
</activity>
启动时将action的内容传递给Intent,category标签的值可调用intent中的addCategory()方法,更精确的指出要启动的Activity.
Intent intent=new Intent("developer.happy.scripo.ACTION_START");
startActivity(intent);
每个Intent只能指定一个action,但却能指定多个category
三、更多隐式Intent的用法
查看网页
Intent intent=new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse("https://www.baidu.com/")); startActivity(intent);
电话
Intent intent=new Intent(Intent.ACTION_DIAL); intent.setData(Uri.parse("tel:10086")); startActivity(intent);
Intent常用动作:
Intent.ACTION_ANSWER 打开接听电话的Activity,默认Android内置拨号界面
Intent.ACTION_CALL 打开拨号盘界面并拨打电话,使用Uri中的数字部分作为电话号码
Intent.ACTION_DELETE 打开一个Activity,对所提供的数据进行删除操作
Intent.ACTION_DIAL 打开内置拨号界面,显示Uri中提供的电话号码
Intent.ACTION_EDIT 打开一个Activity,对所提供的的数据进行编辑操作
Intent.ACTION_INSERT 打开一个Activity,对所提供数据的当前位置插入新项
Intent.ACTION_PICK 打开一个子Activity,从所提供的数据列表中选取一项
Intent.ACTION_SEARCH 启动一个Activity,执行搜索动作
Intent.ACTION_SENDTO 启动一个Activity,向数据提供的联系人发送信息
Intent.ACTION_SEND 启动一个可以发送数据的Activity
Intent.ACTION_VIEW 最常用的动作,对Uri方式传送的数据,根据Uri协议部分以最佳方式启动相应的Activity进行处理,对于http:address将打开浏览器查看,对于tel:address将进行拨号界面并呼叫指定的电话号码。
Intent.ACTION_WEB_SEARCH 打开一个Activity,对提供的数据进行WEB搜索。
四、向下一个活动传递数据
为组件添加事件,向下一个活动传递数据。通过putExtra()方法传递数据给下一个活动,
String data=mEditText.getText().toString();
Intent intent=new Intent(IntentActivity.this,SubActivity2.class);
intent.putExtra("extra_string",data);
startActivity(intent);
在SubActivity2中取数据,通过getIntent()方法获取传递过来的Intent,通过getStringExtra()获取到数据,除了传递String类型的,还可传递其他数据类型的数据,boolean类型的,用getBooleanExtra()接受等等。
dataText= (TextView)findViewById(R.id.get_data_from_intent);
Intent intent=getIntent();
String str=intent.getStringExtra("extra_string").toString();
dataText.setText(str);
五、返回数据给上一个活动
向上一个活动返回数据需要用startActivityForResult()启动Activity ,然后接受一个返回的result。被启动的activity需要指定返回的result,把这个result作为另外一个intent对象返回,我们的activity需要在onActivityResult()的回调方法里面去接收result。
在执行startActivityForResult()时,可以使用explicit 或者 implicit 的intent。当启动另外一个位于的程序中的activity时,我们应该使用explicit intent来确保可以接收到期待的结果。
Intent intent=new Intent(IntentActivity.this,SubActivity.class); startActivityForResult(intent,SUBACTIVITY1);
用startActivityForResult()方法来启动SubActivity,在SubActivity中用setResult()方法把数据返回给上一个Activity。
setResult()方法,专门用于向上一个活动返回数据的,该方法接收两个参数,第一个参数用于向上一个活动返回数据,RESULT_OK 和RESULE_CANCELED 第二个参数,把带有数据的Intent传递回去。
Intent intent=new Intent();
intent.putExtra("data_return","Hello IntentActivity,I am SubActivity");
setResult(RESULE_OK,intent);
finish();
当用户完成了启动之后activity操作之后,系统会调用我们activity中的onActivityResult() 回调方法。该方法有三个参数:
1、通过startActivityForResult()传递的request code。
2、第二个activity指定的result code。如果操作成功则是RESULT_OK ,如果用
3、户没有操作成功,而是直接点击回退或者其他什么原因,那么则是RESULT_CANCELED
包含了所返回result数据的intent。
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode){
case SUBACTIVITY1:
if (resultCode==RESULT_OK){
Uri uriData=data.getData();
mTextView.setText(uriData.toString());
}
break;
}
}
参考内容:
二、郭霖《第一行代码》