Intent 的作用
Intent 的作用 主要作為啟動以及連接 Activity、 Service 或是 BroadcastReceiver 的橋梁。
android Intent。context.startActivity(aIntent)
context.sendBroadcast(aIntent)
context.startService(aIntent)
intent的,對于Activity Service 繼承自 Context,自然可以調用上面的方法, 而 BroadcastReceiver 由于使用時 調用的是 onReceive(context, intent), 所以也是可以調用上述方法。也就是這三個控件可以相互啟動 把自己包裝好的 intent 發給對方(intent 中可以存放數據 (putExtra))這時也是起到了通信的作用
說到互相啟動 不得不提一下 Action 了。也就是 系統怎么知道你想啟動的是什么。 如果之前有接觸過 JavaWeb 的同學知道, 在 web.xml 中有 url-parttern , action 的作用與這相似 也就是在 intent 中設置 action,startActivity 或是 sendBroadcast 等啟動時,系統查找能處理該 action 的
當然如果你知道這個 activity service 或是 Broadcast 的類名, 直接 new Intent(mContext, XXActivity.class) 也可以,只是在不同 app 之間就不能這么用了。
android廣播intent,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 方法,比如
android.intent.category.LAUNCHER、public int size() {
unparcel();
return mMap.size();
android的content。}
我們可以寫成:
bundle.size(); //有點亂入 = =
android.content.Log.d(TAG, bundle.toString());
提到 parcel, 得提一下 parcelable marshall unmarshall.
當你想把一個非基本參數類(非Boolean Integer String常見類)放入到 Bundle, 這個時候可以考慮用 parcel,也就是將你的類 implements parcelable (有點像 Serializable), 寫其 writeParcel readParcel 方法。 當然,在 intent.putParcelableXX時,“可能“(待確認)需要設置額外的 classLoader, 即 在 parcel 之前, intent.setExtrasClassLoader(MyParcel.class.getClassLoader()). 此時 有一個很 buggy 的情況發生了,即
如果你使用 intent.hasExtra (其實是任何一處調用 unparcel 的方法), 會出現 XXXexception, 大概內容是 exception when unmarshall data。
其根本原因(待確認)是:如果在 parcel 之前,setExtrasClassLoader 需要在 unparcel 之前 setExtrasClassLoader。也就是 在任何一處可能收到這個 Intent 的地方需要 setExtrasClassLoader.
有點恐怖 - -,所以 慎用 parcel 或者 setExtrasClassLoader(難道這個可以作為安全選項,只有自己的應用才知道到底要 set 什么 classLoader?)
(待修復)
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态