Android studio中的显式Intent和隐式Intent

啊。肯德基绝对是这个世界上最伟大的发明,我已经在这里呆了将近六个小时了。。。虽然没有网(防止我这种人在肯德基蹭的时间太长了,所以就限制了一下下免费WIFI的使用时间也是可以理解的,hhhh)。
还有,Shift+Enter也是代码世界最伟大的发明,为什么Word里面不行?

想要实现活动之间的跳转,我们至少也要有两个活动,之前我们有一个FirstActivity了,想在我们new一个SecondActivity(empty acticity),勾选Generate Layout File,但不勾选Launcher Activity。布局文件命名为second_layout。

在second_layout.xml里添加一个button:


<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.activitytest.SecondActivity">

    <Button
        android:id="@+id/button_2"
        android:text="button 2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
android.support.constraint.ConstraintLayout>

啊。。。好像其他的并不需要动什么,onCreate方法也给我们写好了(我的意思是布局文件也加载了,毕竟逻辑的东西还是需要我们自己去写。)另外,AndroidManifest.xml文件里也把活动给我们注册好了,但SecondActivity不是主活动,那怎么启动这个活动呢?

下面就是Intent重磅登场的时候了。
Intent大致可以分为两种方式,一种是显示Intent,另一种是隐式Intent。

显式Intent

Intent有多种构造函数的重载,我们这本书里这里只提了一种:
这种方法需要两个参数,第一个是地宫一个启动活动的上下文,第二个是指定想要启动的目标活动。Activity里有一个startActivity方法,我们只要把构建好的Intent传入这个方法就可以启动这个活动了。
我往第一个活动菜单中再添加一个按钮,就不用修改button了。(其实上一篇关闭窗口这个事件我也是放在那个menu里面的..)
就像这样。(这是在”onOptionsItemSelected”这个方法里写的。)

case R.id.second_item:
    Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
    startActivity(intent);
    break;

我试了一下,还可以,这个编码是支持中文的,虽然我没找到在哪里设置Charset。。。

隐式Intent

我给你们看作者是怎么说隐式Intent的。
相比于显示Intent,隐式Intent则含蓄很多,他并不明确指出我们想要启动哪一个活动,而是指定一系列更为抽象的action和category等信息,然后交由系统去分析这个Intent,并帮我们找出合适的活动去启用。
我是怎么理解的呢。我觉得作者在逗我。。。。。。。他的意思是在不同的情况下点击相同的按键可能启动的是不同的活动对吧。应该是,往下看吧。

现在我们一个隐式Intent还没有写,所以现在什么都响应不了。
在AndroidManifest.xml里配置一下SecondActivity:

<activity android:name=".SecondActivity"
           android:label="另一个窗口。">
    <intent-filter>
        <action android:name="com.example.activitytest.ACTION_START"/>
        <category android:name="android.intent.category.DEFAULT"/>
    intent-filter>
activity>

那个lable是我试试中文可不可以自己加的,不要在意。但是标签我是真的看不明白,连自动补全都没有,这个东西到底有没有用啊。
作者说只有action和category同时能够匹配上Intent是这个活动才能相应该Intent。
然后再在menu利加一个选项。

case R.id.yinshi_Intent:
    Intent intent1 = new Intent("com.example.activitytest.ACTION_START");
    startActivity(intent1);
    break;

这是另一种构造函数,表示可以响应”com.example.activitytest.ACTION_START”这个action的Intent虽然应该是要action与category同时匹配才行,但是咱们AndroidManifest.xml里设置的category是给的DEFAULT,所以就是默认的了。
尝试一下添加一个category,在AndroidManifest.xml里intent-fileter标签里加入一行

<category android:name="android.intent.category.SECOND"/>

在case,启动活动之前加上

intent1.addCategory("android.intent.category.SECOND");

就可以了。

多说几个隐式的Intent

更多隐式Intent
(这些都要现在咱们之前那个main.xml的menu目录下面先加一个选项,然后case一下这个选项,就可以直接调用了。)
调用浏览器启动一个网页:

case R.id.baidu_item:
    Intent intent2 = new Intent(Intent.ACTION_VIEW);
    intent2.setData(Uri.parse("http://www.baidu.com"));
    startActivity(intent2);
    break;

调用电话显示拨号界面:

case R.id.call_10086:
    Intent intent3 = new Intent(Intent.ACTION_DIAL);
    intent3.setData(Uri.parse("tel:10086"));
    startActivity(intent3);
    break;

可以看到,这里相较于之前我们的隐式调用不太一样,没关系。我们来看看这都是什么。
首先,这个new一个新的Intent的时候给定了一个构造参数,这是什么意思呢?这个参数是什么呢?大家可能忘记了,我们来做个实验就知道了。
我们先new一个新的activity,就叫ThirdActivity吧,就随便加上一个button(没什么乱用的button),然后,然后配置一下Android Manifest,就想这样

<activity android:name=".ThirdActivity">
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <data android:scheme="http"/>
activity>

{
data标签可以配置一下内容:
Android:scheme 数据协议部分:上面这个是http,这样就可以响应http的Intent了;
Android:host 指定数据的主机部分:上面这个是www.baidu.com
Android:port 用于指定数据的端口部分:一般紧随在主机名后
Android:path 用于指定主机名和端口之后的部分;
Android:mimetype用于指定可以处理的数据类型,允许使用通配符的方式进行指定。
}

就是说,这个action的name和category的name都指定一下,ACTION_VIEW熟悉么?这就是咱们之前调用一个Uri的时候new的一个Intent用的。所以这个时候再点击一下baidu_item这个选项,我们就会看到一个神奇的现象。
(Emm。。。。。。理论上,这个东西,应该弹出两个选项,因为可以响应两个东西,但是因为之前我弹出网页的时候,选的是always用chrome打开,所以这里不弹出来了。。。。绝望,我竟然忘了,检查了半个小时,所以,所以大家去把应用管理那里的授权撤销掉,尽量不要选always。。。。)
终于出来了hhhhhhhh。太聪明了。

你可能感兴趣的:(Android)