以下为我的理解不是标准课本语言,只是方便我自己理解
Intent的作用是作为一个介质,通过调用Intent来激活或跳转到另外一个Activity
Intent分显式和隐式两种,
1.显式 显式是直接调用该activity,直接在第一个activity(FirstActivity)的Java里调用
Intent intent =new Intent(FirstActivity.this,SecondActivity.class);
//在FirstActivity这个活动的基础上打开目标活动SecondActivity.
startActivity(intent);//执行该Intent
2.隐式 隐式是不明确指出我们要启动的活动,而是指定了一系列更为抽象的action和category等信息,然后交由系统去分析匹配这个Intent更加满足那个活动的条件,满足则启动它。
首先,打开AndroidMainifest.xml,向目标activity(SecondActivity)添加如下代码
<intent-filter>
<action android:name="com.graduationdesign.pxc.activitytest.ACTION_START"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
在标签里我们指名了当前活动可以响应com.graduationdesign.pxc.activitytest.ACTION_START
这个action ,而标签则包含了一些附加信息,更加精确的表明了当前活动能够响应的Intent中还可能带有的category。只有和中的内容同时满足Intent中指定的和的活动才能响应该Intent
而初始的FirstActivity我们改变代码如下
Button button1 = (Button) findViewById(R.id.button_1);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Intent intent =new Intent (FirstActivity.this,SecondActivity.class);
// startActivity(intent);
Intent intent = new Intent("com.graduationdesign.pxc.activitytest.ACTION_START");
startActivity(intent);
}
});
上面的例子中我们用的category是默认类,再调用startActivity()方法的时候会自动将这个category添加进Intent中
每个Intent中只能指定一个action,但却能指定多个category。
现在我们来修改FirstActivity代码增加一个category
Button button1 = (Button) findViewById(R.id.button_1);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Intent intent =new Intent (FirstActivity.this,SecondActivity.class);
// startActivity(intent);
Intent intent = new Intent("com.graduationdesign.pxc.activitytest.ACTION_START");
intent.addCategory("com.graduationdesign.pxc.activitytest.MY_CATEGORY");//新增category
startActivity(intent);
}
});
别忘记在AndroidMainifest.xml补上一句
<category android:name="com.graduationdesign.pxc.activitytest.MY_CATEGORY"/>
如下
<activity android:name=".SecondActivity">
<intent-filter>
<action android:name="com.graduationdesign.pxc.activitytest.ACTION_START"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="com.graduationdesign.pxc.activitytest.MY_CATEGORY"/> //补上去
</intent-filter>
</activity>
那为什么明明有简单的显式不用造出这种麻烦的隐式呢?
原来隐式有更加强大的功能,它不仅可以启动自己程序内的活动,还能启动其他程序的活动,这使得Android多个应用程序之间的功能共享成为了可能。比如说你想在你的程序中展示一个网页,这时候只需要调用系统浏览器来打开网页就行而不用再去做个浏览器。
修改SecondActivity中间按钮单击事件的代码如下:
Button button2 = (Button) findViewById(R.id.button_2);
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://blog.youkuaiyun.com/xchaha?ref=toolbar"));
startActivity(intent);
}
});
这里首先指定Intent的action是Intent.Action_VIEW.这是一个Android系统内置的动作,其常量值为android.intent.action.VIEW.然后通过Uri.parse()方法,将一个网址字符串解析成一个Uri对象,再调用Intent的setData()方法将这个Uri对象传递出去
说到网页就不得不说,我们还可以在标签里在配置一个标签,用于更精准的指定当前内容能响应什么类型的数据。标签中主要可以配置以下内容。
android:scheme。用于指定数据的协议部分,如上例的http部分
android:host.用于指定数据的主机部分,如上例子blog.youkuaiyun.com
android:port用于指定数据的端口部分,一般紧随在主机后。
android:path用于指定主机名和端口之后部分,如xchaha?ref=toolbar这些写在域名后指定某个特定位置的内容
android:mimeType 用于指定可以处理的数据类型,可以使用通配符的方式进行指定