Intent详解(一)----显、隐式开启Activity

Intent开启Activity

1.Intent的作用

Intent是一个可以消息传递对象,可以通过它来进行组件之间的信息传递。Intent主要有以下三个作用:

l  开启一个activity

l  开启一个service

l  发送广播消息

本篇主要介绍Intent如何开启一个Activity。
Intent可以启动Activity,启动的方式有显式启动和隐式启动两种。显式启动主要有两个步骤:首先创建一个Intent,指定应用程序上下文和需要启动的Activity; 调用startActivity来启动新的Activity。

Intent intent=new Intent
(MainActivity.this,SecondActivity.class);
startActivity(intent);

简单的两行代码就可以实现显式启动的效果,当然前提是需要先创建一个新的Activity,这里我就不演示创建Activity的过程了。整个上述代码实现的效果如下图:


看到这里,我们会发现显示启动一个Activity确实简单,短短几行代码就实现了功能。在创建Intent的时候,我们传入了两个参数,到底这两个参数是干嘛用的,为了弄清楚有什么用,我们可以通过查看源码来验证自己的猜想(点中Intent的构造方法,Ctrl+鼠标左击)。


第一次点击来到了这里,但是似乎我们还是看不到对参数的操作,所以我们继续点击一次ComponentName方法,进入下一层。


看到这里,估计差不多都明白了这两个参数的作用是什么了,第一个参数是提供起始Activity的包名,第二个参数提供了目标Activity的全限定名(包名+类名),注意,这里是全限定名!我们可以通过设置一个断点来看看是不是这样的。


顺便介绍下在Android Studio中如何设置断点,首先在需要设置断点的地方鼠标左击一下,出现一个红色小点,然后点击一个小虫图标,便进入了Debug模式。


进入Debug模式后,我们可以通过F7一步一步调试,F7可以进入到函数内部,直到执行完才跳出来。当执行到目标处,可以直接将鼠标双击某参数,便可以显示它的值,下图是显示我通过断点得到的结果:


通过断点可以更加清晰看到这两个参数的最终的值,但是安卓系统是如何通过这两个参数来启动Activity的,我们还需要进一步跟踪源码,这里也不过多涉及。言归正传,我们继续回到Intent的作用上来,之前介绍了通过Intent显式启动Activity,现在我们再来介绍隐式启动。


隐式启动不需要指定特定的Activity,只需要指定Intent指定对应的category(类别)、action(动作)、data(数据)即可,具体启动哪一个Activity由系统和用户共同来决定。启动的Activity可以是系统中自带的,也可以是已安装的第三方程序中的Activity,还可以是程序本身的Activity。


隐式启动可以有效的降低组件之间的耦合程度,我们可以回想显式启动时,需要传入两个参数,都需要指定两个具体的Activity(在我们上面的例子中就是MainActivity和SecondActivity),这些都是所谓的hard-code(硬代码),假如,某一天,SecondActivity需要改成ThirdActivity,那么我们无疑需要修改原来的代码。当然,我们可以通过AndroidStudio的重构(refactor)来解决这个问题。显式启动只适合启动自己已知的Activity,面对未知的,我们还是需要学习如何隐式启动。下面将具体介绍。


首先我们先给出一张表,具体的作用我们先不解释,之后在几个例子中,我们一定可以明白其含义。

动作

说明

ACTION_PICK

启动一个子Activity,从提供的数据列表中选取一项

ACTION_SEARCH

启动一个Activity,执行搜索动作

ACTION_SENDTO

启动一个Activity,向数据提供的联系人发送信息

ACTION_SEND

启动一个可以发送数据的Activity

 

ACTION_VIEW

最常用的动作,对以Uri方式传送的数据,根据Uri协议部分以最佳方式启动相应的Activity进行处理。对于http:address将打开浏览器查看;对于tel:address将打开拨号界面并呼叫指定的电话号码

ACTION_WEB_SEARCH

打开一个Activity,对提供的数据进行Web搜索

ACTION_ANSWER

打开接听电话的Activity,默认为Android内置的拨号界面

ACTION_CALL

打开拨号盘界面并拨打电话,使用Uri中的数字部分作为电话号码

ACTION_DIAL

打开内置拨号界面,显示Uri中提供的电话号码

ACTION_EDIT

打开一个Activity,对所提供的数据进行编辑操作

ACTION_DELETE

打开一个Activity,对所提供的数据进行删除操作

ACTION_INSERT

打开一个Activity,在提供数据的当前位置插入新项

我们选取其中几个Action做演示,先演示下如何直接拨打电话,我们现在可以对应上表中的内容,首先设置Intent的Action,我们选取ACTION_CALL,然后再用setData方法设置data属性。Activity完整代码如下

public class MainActivity extends AppCompatActivity {

    private Button button;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        button=findViewById(R.id.button1);

        button.setOnClickListener(new View.OnClickListener() {
            @SuppressLint("MissingPermission")
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(Intent.ACTION_CALL);
                intent.setData(Uri.parse("tel:10086"));
                startActivity(intent);
            }
        });
    }
}

需要注意的是,拨打电话还需要权限,我们还得在AndroidManifest.xml中添加这么一句:

<uses-permission android:name="android.permission.CALL_PHONE" />

Intent的构造方法也支持直接传入URI,效果同调用setData方法一样,现把另一种写法也贴出来,两者的效果一样:

public void onClick(View v) {
    Intent intent = new  Intent(Intent.ACTION_CALL,Uri.parse("tel:10086"));
    startActivity(intent);
}

运行的结果如下图:


我们再演示一个发送短信的Demo,其他的都大同小异,只需要修改URI即可,上表中也给出了各个Action的URI的写法。MainActivity的代码如下:

button.setOnClickListener(new View.OnClickListener() {
    @SuppressLint("MissingPermission")
    @Override
    public void onClick(View v) {
        Intent intent = new Intent(Intent.ACTION_SENDTO,Uri.parse("smsto:10086"));
        startActivity(intent);
    }
}
运行结果如下图所示。

 

WEB浏览器搜索代码写法:

button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Intent intent = new Intent(Intent.ACTION_WEB_SEARCH);
        intent.putExtra(SearchManager.QUERY, "android");
        startActivity(intent);
    }
});

至于其他的各种Action怎么使用,我们都可以通过百度或者官方文档来查看怎么使用。


上面我们实现了如何调用系统的Activity,接下来我们将来实现如何让我们自己的程序也可以响应一些Intent请求。我们知道,隐式启动Activity时,并没有在Intent中指明Activity所属的类,因此,Android系统存在匹配机制,使Android系统能够根据Intent中的数据信息,找到需要启动的Activity。这种匹配机制是通过Android系统中的Intent过滤器(Intent Filter)来实现的。


Activity在AndroidManifest.xml文件中设置Intent过滤器。在自身<activity>标签下,定义<intent-filter>子节点, <intent-filter>节点支持<action>标签、<category>标签和<data>标签,分别用来定义Intent过滤器的“动作”、“类别”和“数据”。对应该组件所支持的动作、执行的环境和数据格式等信息。


例如:我们编写一个自己的可以响应浏览请求的Activity,用户需要访问网站时,为用户提供另外一个选择。Activity中关键代码:

button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Intent intent = new Intent(Intent.ACTION_VIEW,Uri.parse("http://www.baidu.com"));
        startActivity(intent);
    }
}); 
然后我们还需要在AndroidMainfest.xml中配置action,category,data标签。
<activity android:name=".SecondActivity">
    <intent-filter tools:ignore="AppLinkUrlError">
        <action android:name="android.intent.action.VIEW"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <data android:scheme="http"/>
    </intent-filter>
</activity>
最终的效果:


分析到这里,我们已经实现了如何通过显式和隐式开启Activity,下一节将会具体介绍Intent过滤器。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小胖墩有点瘦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值