android Intent,android intent包裝,Android 中的 Intent

 2023-10-05 阅读 20 评论 0

摘要:Intent 的作用Intent 的作用 主要作為啟動以及連接 Activity、 Service 或是 BroadcastReceiver 的橋梁。android Intent。context.startActivity(aIntent)context.sendBroadcast(aIntent)context.startService(aIntent)intent的,對于Activity Service 繼承自 Context,

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?)

(待修復)

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/1/114321.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息