新建一个工程,工程名为ActivityTest,分别创建两个活动FirstActivity和SecondActivity,布局文件分别为first_layout和second_layout,并分别添加一个Button控件。
1.first_layout.xml文件
3.现在通过FirstActivity活动隐式地启动SecondActivity活动,需在AndroidManifest.xml文件中配置内容,将action配置为
com.example.activitytest.ACTION_START, category配置为android.intent.category.DEFAULT
4.SecondActivity.java文件
5.FirstActivity.java文件中添加按键监听,在onClick方法中隐式启动活动
6.action和category要同时匹配上才能响应,SecondActivity中指定了默认的category,在调用startActivity方法的时候会自动将这
个android.intent.category.DEFAULT添加到Intent中,运行一下程序,点击Button 1一下,会启动SecondActivity,说明下的配置生效了。
7.每个Intent只能指定一个action,但却能指定多个category,现在在onClick方法中再增加一个category(com.example.activitytest.MY_CATEGORY)
8.运行程序,点击一下Button 1,app出现崩溃,在logcat查看日志,错误信息提示没有一个活动可以响应Intent,抛出了ActivityNotFoundException
异常.
9.检查AndroidManifest.xml中的SecondActivity中的没有配置category为com.example.activitytest.MY_CATEGORY,将其添加上,如下
10.重新运行程序,点击一下Button 1,会开启SecondActivity活动,刚才的崩溃问题也得到解决。
更多隐式Intent的用法
1.将FirstActivity中按钮点击事件的代码修改成如下
2.这里指定了系统内置的动作Intent.ACTION_VIEW,其常量值为android.intent.action.View,然后通过Uri.parse()方法,将一个网址字符串解析成一个Uri对象,再调用Intent的setData()方法将这个Uri对象传递进去,运行程序,点击Button 1会打开系统浏览器并跳转到百度主页。
3.与此对应,我们还可以在标签中配置一个标签,用于更精确地指定当前活动能够响应什么类型的数据,标签主要可以配
置以下内容。
android:scheme -用于指定数据的协议部分,如上面的http部分
android:host -用于指定数据的主机名部分,如上面的www.baidu.com部分
android:port -用于指定数据的端口部分,一般紧随在主机名之后
android:path -用于指定主机名和端口之后的部分,如一段网址中跟在域名之后的内容
android:mimeType -用于指定可以处理的数据类型,允许使用通配符的方式进行指定。
4.右击com.example.activitytest包->New->Activity->Empty Activity,新建ThirdActivity,并勾选Generate Layout File,给布局起名为third_layout,点
击finish完成创建,然后编辑third_layout.xml文件成如下
5.在AndroidManifest.xml文件中将ThirdActivity的中配置了当前活动能够响应的action是Intent.ACTION_VIEW的常量值,而category使用了默认的category值,另外在标签中配置了andoird:scheme指定了数据的协议是http协议,这样ThirdActivity应该就和浏览器一样,能够响应一个打开网页的Intent了。
6.运行程序,点击Button 1会弹出一个列表,显示目前能够响应这个Intent的所有程序,如果选择ActivityTest,则会启动ThirdActivity。
隐式Intent启动一个系统的拔打电话界面
1.将FirstActivity中的onClick方法中的内容修改为如下
2.运行程序,点击Button 1会启动一个系统拔号界面。
2.second_layout.xml文件
package com.example.activitytest; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; public class SecondActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.second_layout); } }
package com.example.activitytest; import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; public class FirstActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.first_layout); //通过id找到按键控件对象 Button button1 = (Button) findViewById(R.id.button_1); //设置按键点击事件 button1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // 隐式Intent Intent intent = new Intent("com.example.activitytest.ACTION_START"); //启动SecondActivity活动 startActivity(intent); } }); } }
package com.example.activitytest; import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; public class FirstActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.first_layout); //通过id找到按键控件对象 Button button1 = (Button) findViewById(R.id.button_1); //设置按键点击事件 button1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // 隐式Intent Intent intent = new Intent("com.example.activitytest.ACTION_START"); //新增一个category intent.addCategory("com.example.activitytest.MY_CATEGORY"); //启动SecondActivity活动 startActivity(intent); } }); } }
10-05 21:12:11.495 25997-25997/com.example.activitytest E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.activitytest, PID: 25997
android.content.ActivityNotFoundException: No Activity found to handle Intent { act=com.example.activitytest.ACTION_START cat=[com.example.activitytest.MY_CATEGORY] }
button1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse("http://www.baidu.com")); startActivity(intent); } });
button1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(Intent.ACTION_DIAL); intent.setData(Uri.parse("tel:10086")); startActivity(intent); } });