Android Activity的显示Intent和隐式Intent

昨天晚上把自己上次写的那个简陋APP继续往下写了写。

因为之前的的内容只有一个活动,另外再加上一个菜单。但是对于现在的APP来说,一个应用程序往往都还有很多活动。一般从主活动跳转到其他活动使用的大概就是显式Intent和隐式Intent两种。Intent是Android程序中各组件之间进行交互的重要方式,它不仅可以指明当前活动组件想要执行的动作,还可以在不同组件中传递数据。一般被用来启动活动,服务等。

  • 显式Intent

我们先写一个second_activity_layout的布局文件,把它作为我们第二个活动的布局文件。

可以发现我这里居然又设了一个id为button_2的按钮,但是并没有对程序造成什么影响。因为在活动中我们会具体指定到底引用的是哪个布局文件,所以在不同的布局文件中使用同名id并没有什么影响。就像我们在不同的文件夹里可以写重名的文档一样。

并新建立一个SecondActivity。

接下来在AndroidMainfest.xml中完成注册即可。新加代码:

第二个活动已经完成,但是我们仍然无法在程序中启动它。我们可以在FirstActivity中加入一个新的按钮,并让它的点击事件来启动第二个活动。

Intent有多个构造函数,这里我使用的这个函数Intent(Context packageContext,Class<?> cls)第一个参数是提供一个可以启动活动的上下文,第二个则是指定想要启动的目标活动。Activity类中有一个startActivity()方法,这个方法专门用来启动活动,它接受的是一个Intent的参数。我们把构建好的Intent传入startActivity()就可以启动SecondActivity了。

 

  • 隐式Intent

隐式Intent是指我们并不去指定我们想要启动哪个活动而是通过指定一系列的action,category,data之类的信息,让系统去筛选符合条件的Activity,而这些筛选条件需要我们在<intent-filter>配置。

在这里我们简单的写一个ThirdActivity,来尝试一下隐式Intent调用。在ThirdActivity的注册中,我们需要配置<intent-filter>标签里的内容。

需要注意的是被调用的Activity要有一个带有<intent-filter>并且包含<action>的Activity,设定它能处理的Intent,并且category设为”android.intent.category.DEFAULT”。这是一种默认的category,必须添加的。action的name是一个字符串,可以自定义,这个字符串中千万不能有空格教训啊!!但是因为这个Activity也可以被其他应用程序调用,只要有这个action字符串即可,所以为了防止应用程序互相影响,一般命名方式是包名+Action名.这里我只是为了方便所以直接写了ACTION_START。一个Intent只能指定一个action但是我们却可以添加多个category来更精确。

现在我们在FirstActivity中在添一个按钮。

现在我们也可以通过button4来启动第三个活动啦~

当然以上我们都是启动自己程序内的活动,但就像我之前说的只要Action字符串匹配我们也可以调用其它程序的活动。比如安卓系统自带的浏览器和拨号等等。。

我们接下来尝试一下通过这个丑陋的APP来打开百度一下手机没翻墙= =

在FirstActivity再加一个按钮控件,并进行设置,代码如下:

在这里我们指定Intent的action是Intent.ACTION_VIEW,这是一个安卓系统内置的动作即显示用户的数据。setData()接受一个Uri对象,主要用于指定当前Intent正在操作的数据,而Uri.parse()方法是将一个网址的字符串解析成一个Uri对象。这样上面的代码便可以为我们百度一下啦。http则是一种Intent的协议,还有类似的协议比如tel表示拨打电话,geo显示地理位置等等。

手机最重要的还是要拨号吧,有时候可能忘记了某个重要人物的号码,我们也可以为这个APP加上打开拨号面板的功能。

与上面的百度一下类似,Intent.ACTION_DIAL是一种安卓系统内置的动作,打开拨号面板,然后data部分指定了协议是tel,号码是10086.这样拨号面板这个Action也被我们这个辣鸡APP调用了。。。

但是如果有两个活动都符合我们<action>和<category>的筛选条件该怎么办呢?系统就会以对话框列表的方式让用户进行选择。

总结起来就是:每个Intent中只能指定一个action,但却能指定多个category;类别越多,筛选条件越多,那么动作也就更加精确,调用的活动才不会与我们的预期出现大的差别。就先写到这里吧~其实还有很多地方需要注意回来继续学习补坑。

发表评论

电子邮件地址不会被公开。 必填项已用*标注