我们现在修改FirstActivity中,Button的点击响应事件
@Override
protected void onCreate (Bundle savedInstanceState) {
……
Button button1 = (Button) findViewById (R.id.button_1) ;
button1.setOnClickListener (new OnClickListener() {
@Override
public void onClick (View v) {
Intent intent = new Intent (FirstActivity.this , SecondActivity.class) ;
startActivity (intent) ;
}
}) ;
}
这是Intent的其中一个构造函数
Intent (Context packageContext , Class <?> cls) ;
参数:
1. 第一个参数Context是启动活动的上下文
2. 第二个参数Class则是想要启动的目标活动
所以这里,我们的意图很明显
Intent intent = new Intent (FirstActivity.this , SecondActivity.class);
新建一个名字为intent的Intent对象,然后是从FirstActivity开始,启动SecondActivity
startActivity (intent) ;
通过startActivity ( )来执行这个Intent,传入构建好的intent
正因为这种Intent的意图十分明显,所以称作显式Intent
比起显式Intent,隐式Intent则更为含蓄,它通过一系列更加抽象的action和category,交由系统去分析这个Intent,从而找到对应的活动
通过在AndroidManifest.xml中配置SecondActivity,添加指定当前活动能够响应的action和category
……
<application
……
>
……
<activity
android:name = ".SecondActivity"
>
<intent-filter>
<action android:name = "com.example.activitytest.ACTION_START" />
<category android:name = "android.intent.category.DEFAULT" />
intent-filter>
activity>
application>
标签中指明了当前活动可以响应的action是com.example.activitytest.ACTION_START;标签中则包含了一些附加信息,更加精确地指明了当前活动能够响应的Intent还可能带有的category。只有和中的内容可以同时匹配Intent中指定的action和category,这个活动才可以响应这个Intent
在FirstActivity.java中,设置Intent
@Override
protected void onCreate (Bundle savedInstanceState) {
……
Button button1 = (Button)findViewById (R.id.button_1) ;
button1.setOnClickListener (new OnClickListener() {
@Override
public void onClick (View v) {
Intent intent = new Intent ("com.example.activitytest.ACTION_START") ;
startActivity (intent) ;
}
}) ;
}
可以看出,我们直接传入action,intent可以响应这个action。奇怪的是,说好的category去哪了?原来,android.intent.category.DEFAULT是一种默认的category,在startActivity( )中会自动添加这个
但是:
如果我们修改category为其他的该怎么响应呢?
例如,category修改为或者添加下面代码:
name = "com.example.activitytest.MY_CATEGORY" />
那么我们便需要为intent添加多一个category:
Intent intent = new Intent =("com.example.activitytest.ACTION_START") ;
intent.addCategory ("com.example.activitytest.MY_CATEGORY") ;
startActivity (intent) ;
这样,便可以匹配到了
从这里我们可以看出,一个Intent只可以指定一个action,但是却可以指定多个category。
修改FirstActivity.java中的Button点击部分的代码
@Override
protected void onCreate (Bundle savedInstanceState) {
……
Button button1 = (Button) findViewById (R.id.button_1) ;
button1.setOnClickListener (new OnClickListener () {
@Override
public void onClick (View v) {
Intent intent = new Intent (Intent.ACTION_VIEW) ;
intent.setData (Uri.parse("http://www.baidu.com")) ;
startActivity (intent) ;
}
}) ;
}
效果是:点击Button之后,就会调用系统浏览器来打开百度这个网页
我们来关注这三行代码:
Intent intent = new Intent (Intent.ACTION_VIEW) ;
intent.setData (Uri.parse("http://www.baidu.com")) ;
startActivity (intent) ;
首先,指定了Intent的action是Intent.ACTION_VIEW。这是一个Android内置的动作。它的值为”android.intent.action.VIEW”。这个比较通用。它会根据数据类型来打开相应的活动
然后,我们使用Uri的parse( )方法,将传入的网址字符串转换为一个Uri对象,然后作为参数,调用Intent的setData( )方法,将这个Uri对象传递进去
举个实际的例子:
content://com.example.project:200/folder/subfolder/etc
\-----/ \------------------/ \--/\----------------------/
scheme host port path
\-----------------------/
authority
假设有项目中又创建了第三个活动ThirdActivity,则在它的注册页面代码为:
<activity
android:name = ".ThirdActivity"
>
<intent-filter>
<action android:name = "android.intent.action.VIEW" />
<category android:name = "android.intent.category.DEFAULT" />
<data android:scheme = "http" />
intent-filter>
activity>
效果:这样,这个活动可以和浏览器一样响应关于网页的请求
button.setOnClickListener (new OnClickListener () {
@Override
public void onClick (View v) {
Intent intent = new Intent (Intent.ACTION_VIEW) ;
intent.setData (Uri.parse ("tel:10086")) ;
startActivity (intent) ;
}
}) ;
这样点击这个Button就可以调出拨号界面,并自动填充号码为10086