当一个 app lication 中有多个 Activity 的时候,那么每个 Activity 之前的传值就是一个问题了。所以这里介绍一下相关的方法。
在 Android 平台 传值,主要使用两种方法一个事 PendingIntent 另一个就是广播了
按照大类,我把相关的类进行了划分
1. 实体类 Intent 、 Context 、 BroadcastReceiver
2. 方法类 PendingIntent Context.sendBroadcast
传递的方法 也就是方法类中的两种
A Intent 字面意思是意图,其实他的效果 和字面意思差不多,高焕堂的很多书中都有详细的介绍。
他就像一个快递员,而且是个无所不能的快递员,什么都能送,只要你能把信息加到他上面去
详细的使用方法可以再 SDK 中找到,如果想要添加你想要的内容 可以用 Intent.set** 系列方法。
B Context 这个翻译成环境 更好一些
顾名思义 他就是获取 我们当前的环境状态, 比如说我想知道现在用户使用的什么语言,处于什么状态,航班、静音。用户有没有接打电话
等等,就像我们获取系统 时间一样。 Context 也我们设置 了一个容器让我们来获取系统的状况。
因为这个系统状况很重要,有的时候就是以系统状态为依据,所以 Intent 好多方法都要加入这个 都需要 Intent.context
C BroadcastReceiver 是专门用来接收广播的类
所以他有一个 OnReceive() 的方法 而具体的接受 我在下面详述。
α PendingIntent 这个方法就是直接传递 Intent
好传出了,怎么才能保证能接收到呢?因为 Intent 是一个很强大的快递员,他能记录货物需要达到的地点,所以 PendingIntent 干吗,他相当于一个 Intent 的工作场所,他只负责吧 Intent 送出去
而 Intent 去那里,直接告诉 Intent 就可以了
通过下面这条语句就可以达到显影的效果 intent.setClass(Activity.this// 指代 Activity, Report.class// 指代目标类 );
接收端怎么获取消息呢,这个也简单。因为 Intent 已经按照他自己的地址来到了所处的地方,我们直接实例化就行了。
当然这是在简单的情况下,就是说如果这个公司只有一个货物所以我们之需要一个快递员就可以,接收方目前只有这个货物需要接收,那快递员一到他接收方只要确认一下就知道他来干嘛了。
但多数情况下,两家公司的业务非常繁忙,所以可能有多个快递员,多个货物,同一个部门可能有多个。那么怎么来做呢。就需要加限定规则
(1) 首先是 在 Intent 中加限定,可以设定一个 Permission String 就像暗号一样,如果暗号对了肯定错不了 (这个在广播方法中很重要 )
(2) 另一个就是在实例化的时候确定好实例的是那个一个 参数
具体的请大家参看 SDK
β 使用广播来进行数据 传递
如果直接使用 PendingIntent 是有目的的传送, 那广播可真算是漫无目的的传送信息了
其实 Broadcast 中传递的内容也是 Intent ,但可以传递的范围可是远的多。
而且系统的很多其他程序 也在发送广播,比如说手机 的状态,还要说一下航班状态,如果出于航班状态,那么系统就会自动发送广播,而我们只要去接收就好,这样我们就能知道哦,系统现在时在广播状态。
而在 Widget 接受方法使用广播,一方面是因为 AppWidget 本来就是继承 BroadcastReciever 所以比较纯,不会出问题。另外,这个是我的个人判断,因为 Widget 还是和普通的 app 不同,我估计如果直接给 Widget 传送 Intent 又会受到限制,就像 handler 的一样,当然这是我的猜测,但是感觉还是用 广播靠谱
广播的载体是 Intent ,但是他们的标号则是 Action 。系统内定了很多 Action 。
当然我们也可以自己定义 Intent 。 之需要 Intent(" 你自己定义的一个字符串 ")
接收方麻烦一些 需要 注册
registerReceiver(intent, commandFilter);
第二个参数是 Intent 的过滤,而且不能为空。
如果是自己定义的 Action 那还需要
String action = intent.getAction();
if (action.equals(" 自定定义的 Action")) { 相应的 Intent 的实例化 必须在这里进行
}
Σ Widget 使用 PendingIntent 是因为 没有其他的方法了。说实话 AppWidget 就给我们一个 可以使用 RemoteView s 的方法,别的都不能用。所以就顺势写了一个 SetPeningIntent 当然这个方法也有很多固定的用法 ,启动服务,启动活动 ,发送广播,基本上该有的他都有了 。
3. 最后再来说一下 Action 其实一个字符串但是这个字符串 因为很长所以基本上很少有人和其明明重合
他们就是来定义一些状态,还是航空状态,他的的 Action 就是
ACTION_AIRPLANE_MODE_CHANGED
具体的什么在 Intent 搜索一下都能找到