Android 中的 Intent

Intent 的作用

Intent 的作用 主要作为启动以及连接 Activity、 Service 或是 BroadcastReceiver 的桥梁。

  • context.startActivity(aIntent)
  • context.sendBroadcast(aIntent)
  • context.startService(aIntent)

对于Activity Service 继承自 Context,自然可以调用上面的方法, 而 BroadcastReceiver 由于使用时 调用的是 onReceive(context, intent), 所以也是可以调用上述方法。也就是这三个控件可以相互启动 把自己包装好的 intent 发给对方(intent 中可以存放数据 (putExtra))这时也是起到了通信的作用

说到互相启动 不得不提一下 Action 了。也就是 系统怎么知道你想启动的是什么。 如果之前有接触过 JavaWeb 的同学知道, 在 web.xml 中有 url-parttern , action 的作用与这相似 也就是在 intent 中设置 action,startActivity 或是 sendBroadcast 等启动时,系统查找能处理该 action 的 <activity (<receiver 或者  <service) , 如果多个能相应一般会出现一个选择按钮。(这个跟 priority 的大小有关,有兴趣可以查一下)
当然如果你知道这个 activity service 或是 Broadcast 的类名, 直接 new Intent(mContext, XXActivity.class) 也可以,只是在不同 app 之间就不能这么用了。

Intent 中的 Extra

Intent 中可以通过 putExtra 将键值对存放在 Bundle mExtra中,这个键值对 如果你忘了其 key 是多少了, 可以直接 intent.getExtra().toString(), Bundle 的 toString 的实现方式就是 map.toString() 也就是 print “key = value & …”,有时会看到 “Bundle[mParcelledData.dataSize=?]”, 此时想看对方存入的内容是什么 这个时候得提一下 unparcel
unparcel 方法的大概内容是 将mParcelledData 转成 mMap,此时就可以直接 Bundle.toString 查看了。当然 如果你看了源码, 发现它居然访问权限是 package 的,怎么调用呢? 使用反射吗? 不, 这里有一个 tricky 的方法。有一大堆的 public 方法,比如

 public int size() {
    unparcel();
    return mMap.size();
 }

我们可以写成:

bundle.size(); //有点乱入 = =
android.content.Log.d(TAG, bundle.toString());

关于 Parcel,可以参考一下下面的教程:
Android中Parcelable接口用法
需要提一点是:在你调用 unparcel 的时候(请看一下 Bundle.java 与 BaseBundle.java 了解一下什么时候调用 unparcel )需要确定是否已经将实现 parcellable 的类加载了。由于是序列化的东西 你去读他时需要知道读出来的是什么(记得 之前学习 RMI 的时候,两边的代理类都需要一致 同一份代码 编译俩份都不行 )链接

所以需要在 unparcel 之前调用

intent.setExtraClassLoader(MyClass.class.getClassLoader())

噢 对 不调用这个方法是会抛异常的,忘了是什么异常了(生活的电脑没有代码。。),大概内容是 exception when unparcel xxx data

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值