文章目录
前言
Intent是android程序中各组件之间进行交互的一种重要方式,他不仅可以指明当前组件想要执行的动作,还可以在不同的组件之间传递数据。Intent一般可以用于启动活动,启动服务以及发送广播等场景。
这里Intent:用于由主活动跳转到其他活动
一、显示Intent
首先创建一个新的活动
布局文件是自己创建的,没用自动创建的那个
在AndroidMainifest.xml中添加标签
在FirstActivity中的OnCreate方法里添加两句代码构建Intent
Intent intent=new Intent(FirstActivity.this,SecondActivity.class);
startActivity(intent);
运行点击button1就可以跳转到secondActivity了。
二、隐式Intent
不明确指出想要启动那个活动,制定一系列抽象的action和category等信息,交由系统去分析这个Intent,找出合适的活动启动,就是指可以响应这个Intent的活动。
首先在AndroidMainifest.xml;里的secondActivity的标签里面添加intent,指明secondActivity可以相应的action和category,只有中的内容同时能够匹配上Intent指定的action和category这个活动才可以响应Intent。
<intent-filter>
<action android:name="com.example.a102.myapplication.ACTION_START"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
修改FirstActivity中的按钮点击事件
Intent intent=new Intent("com.example.a102.myapplication.ACTION_START");
没有在这里说明category,因为是默认的
如果在FirstActivity中指定了category,但是没有在AndroidMainifest中指定,是无法响应的
在AndroidMainifest中也要指定category,不然会报错
三、更多隐式Intent的用法
实现点击按钮打开浏览器,只需在FirstActivity的onCreate里加
Intent intent=new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.baidu.com"));
与此对应的,还可以在标签中再配置一个标签,用于更加精确地指定当前活动能够响应什么类型的数据。
标签可以配置以下内容:
android:scheme 用于指定数据的协议部分,例如http部分
android:host 用于指定数据的主机名部分,例如www.baidu.com
android:port 用于指定数据的端口部分,一般紧随在主机名之后
android:path 用于指定主机名和端口之后的部分,如一段网址中跟在域名之后的内容
android:mimeType 用于指定可以处理的数据类型,允许使用通配符的方式进行指定
只有当标签指定的内容和Intent中携带Data完全一致,活动才可以响应该intent
新建一个活动ThirdActivity,勾选Generate Layout File,布局文件起名为third_layout
在AndroidMainifest中修改第三个活动的注册信息
<activity android:name=".ThirdActivity" android:label="Activity3">
<intent-filter>
<action android:name="android.intent.action.VIEW"></action>
<category android:name="android.intent.category.DEFAULT"/>
<data android:scheme="http"></data>
</intent-filter>
</activity>
运行FirstActivity点击按钮
就会出现activity3的选项
拨打电话
Intent intent=new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.baidu.com"));
运行结果
地图定位
Intent intent=new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("geo:39.899533,116.036476"));
startActivity(intent);
运行结果
其他的intent用法
四、向下一个活动传递数据
Intent中提供了一系列putExtra()方法的重载用于传递数据,方法可以将想要传递的数据暂存到intent里,启动另一个活动后再将数据取出,例如将FirstActivity中的字符串传递到SecondActivity中:
在FirstActivity中:
String data="hello secondActivity";
Intent intent=new Intent(FirstActivity.this,SecondActivity.class);
intent.putExtra("extra_data",data);
startActivity(intent);
在SecondActivity中:
Intent intent=getIntent();
String data=intent.getStringExtra("extra_data");
Log.d("SecondActivity",data);
运行后在logcat中可以看到数据传输成功
五、 返回数据给上一个活动
Activity中有一个startActivityForResult()方法,用于启动活动,这个方法期望在活动销毁的时候能够返回一个结果给上一个活动。
首先在FirstActivity中
修改按钮点击事件:
Intent intent=new Intent(FirstActivity.this,SecondActivity.class);
startActivityForResult(intent,1);
重写onActivityResult方法:
@Override
protected void onActivityResult(int requestCode,int resultCode,Intent data)
{
switch (requestCode)
{
case 1:
if(resultCode==RESULT_OK)
{
String returnedData=data.getStringExtra("data_return");
Log.d("FirstActivity",returnedData);
}
break;
default:
}
}
在SecondActivity中:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.second_layout);
Button button2=(Button) findViewById(R.id.button_2);
button2.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view)
{
Intent intent=new Intent();
intent.putExtra("data_return","hello FirstActivity");
setResult(RESULT_OK,intent);
finish();
}
});
运行结果:
但是如果用户不点击按钮,back退出活动二,就不能显示返回数据,可以通过在secondActivity中重写onBackPressed方法来解决:
@Override
public void onBackPressed()
{
Intent intent=new Intent();
intent.putExtra("data_return","hello FirstActivitgy");
setResult(RESULT_OK,intent);
finish();
}
这样只要销毁了活动二就会给活动一返回一个数据。