码迷,mamicode.com
首页 > 其他好文 > 详细

活动组件(三)

时间:2016-01-04 22:30:07      阅读:271      评论:0      收藏:0      [点我收藏+]

标签:

大多数的安卓应用都不止一个Activity,而是有多个Activity。但是点击应用图标的时候,只会进入应用的主活动。

因此,前面我已经建立了一个主活动了,名字是myActivity,现在我再建立一个活动,这个活动不是主活动,名字是SecondActivity,布局名字是second_layout.xml,代码如下:

技术分享

然后创建一个新的活动,代码如下:

技术分享

然后在AndroidMainfest.xml文件中为SecondActivity进行注册,只需要下面一行代码就可以了:

            <activity android:name=".SecondActivity"></activity>

现在第二个活动也建立好了,下面就是如何启动第二个活动了,解决办法就是使用Intent。

      Intent是Android程序中各个组件之间进行交互的一种重要方式,它不仅可以指明当前组件要执行的动作,还可以在不同组件之间传递数据。Intent一般可用于启动活动、启动服务、以及发送广播等场景。Intent的用法大致可以分为两种,显式Intent和隐式的Intent。

显示Intent

      Intent有多个构造函数,其中一个是Intent(Context packageContext,Class<?> cls)。这个构造函数接收两个参数,第一个参数指明启动活动的上下文(即当前的活动),第二个参数Class指明想要启动的目标活动,通过这个构造函数就可以构建出Intent的“意图”。Activity类中提供了一个startActivity()方法,这个方法是专门用于启动活动的,它接收一个Intent参数,可以将构建好的Intent传入startActivity()方法中就可以启动目标活动了,修改主活动myActivity中的button1的点击事件,代码如下:

技术分享

这样点击在主活动中点击button1就可以跳转到活动2中去了,如果想回到上一个活动,就按下Back键,那么当前活动销毁,回到上一个活动。

使用这种方式来启动活动,“意图”十分明显,因此称为显式的Intent

隐式Intent

相比较与显式Intent,隐式Intent并不明确指出想要启动哪一个活动,而是指定一系列更为抽象的action和category等信息,然后交由系统去分析这个Intent,并找出合适的活动去启动。

为了测试,把SecondActivity的注册内容改为如下形式:

技术分享

在action标签中指明了当前活动可以响应com.example.app2.ACTION_START这个action,而<category/>这个标签包含了一些附加信息,更精确指明了当前活动能够响应的Intent中还可能带有category,只有<action>和<category>中的内容都匹配上Intent中指定的action和category时,这个活动才能响应该Intent。技术分享

     可以看到,使用Intent的另一个构造函数,直接将action的字符串传了进去,表明想要启动能够响应com.example.app2.ACTION_START这个action的活动。那么category呢,不是说两个都匹配上才行吗?这是因为android.intent.category.DEFAULT是一种默认的category,在调用startActivity方法时自动将这个category添加到Intent中去了。

     每一个Intent中只能指定一个action,但却能指定多个category,如下:

技术分享

运行程序之后,发现程序崩溃了,那是因为注册SecondActivity时没有添加com.example.myCategory这个category,所以必须把它添加上,如下:

技术分享

这样就可以了。

更多隐式Intent的用法

      使用隐式的Intent不仅可以启动自己程序内的活动,还可以启动其它程序的活动,这使得Android多个程序之间的功能共享成为了可能。比如应用中需要展示一个网页,你没必要去实现一个浏览器,而只是需要调用系统的浏览器来打开这个网页就行了,如下:

技术分享

     上面的代码首先指定了Intent的action是Intent.ACTION_VIEW,这是一个Android系统内置的动作,其常量值是android.intent.VIEW.然后通过Uri.parse()方法,将一个网址字符串解析成一个uri对象,在调用Intent的setData()方法将这个Uri对象传递进去。

与此对应,可以在<intent-filter>标签中再配置一个<data>标签,用于更精确指定当前活动能够响应什么数据类型,<data>标签中可以配置一下内容:

1.android:scheme

  用于指定数据的协议部分,如上例中的http部分。

2.android:host

  用于指定数据的主机名部分,如上例中的www.baidu.com部分

3.android:port

用于指定数据的端口部分,一般紧随在主机名后面。

4.android:path

用于指定主机名和端口之后的部分,如一段网址中跟在域名之后的内容

5.android:mineType

用于指定可以处理的数据类型,允许通配符的方式进行指定。

只有<data>标签中的内容和Intent携带的data完全一致时,当前活动才能响应。  

      除了http协议之外,还可以指定其它协议,比如geo表示显示地理位置、tel表示拨打电话。下面的代码就是如何在程序中调用系统拨号界面的:

技术分享

向下一个活动传递数据

      Intent还可以在启动活动的时候传递数据。思路十分简单,Intent中提供了一系列putExtra()方法的重载,可以把想要传递的数据暂存在Intent中,启动了另一个活动之后,只需要把这些数据再从Intent中取出来就行了。主活动的代码如下:

技术分享

那么响应活动的代码如下:

技术分享

返回数据给上一个活动

 

活动组件(三)

标签:

原文地址:http://www.cnblogs.com/hujingwei/p/5100246.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!