android 传值精讲

来源:互联网 发布:淘宝注册年龄要求 编辑:程序博客网 时间:2024/06/05 15:40

 当一个application 中有多个 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 就给我们一个 可以使用RemoteViews 的方法,别的都不能用。所以就顺势写了一个SetPeningIntent 当然这个方法也有很多固定的用法 ,启动服务,启动活动 ,发送广播,基本上该有的他都有了 。



3.最后再来说一下 Action  其实一个字符串但是这个字符串 因为很长所以基本上很少有人和其明明重合
   他们就是来定义一些状态,还是航空状态,他的的Action就是
ACTION_AIRPLANE_MODE_CHANGED

   具体的什么在Intent 搜索一下都能找到

4 也可以用存储文件或数据库的形式,传值,在onResume调用

原创粉丝点击