創建 Intent 時的誤區

關于Intent的基本用法網上很多,就不再贅述,下面講一個容易理解錯的點

我們在構建 Intent對象是最常用的方式是這樣

Intent intent =newIntent(this, XXX.class);

this指當前的 activity類,activity 最終繼承自 Contenxt,class指目標activity.

也就是調用的這個構造方法

public Intent(Context packageContext, Class cls) {

? ? ?mComponent=new ComponentName(packageContext, cls);

}

這里存在的誤區就是誤以為 第一個Context類型參數就是指的當前 的activity,其實這是不對的

繼續從源碼分析 new ComponentName(packageContext, cls) 使用的構造函數是這樣的

public ComponentName(Context pkg, Class cls) {

? ? ? ? ? ?mPackage= pkg.getPackageName();

? ? ? ? ? ?mClass= cls.getName();

}

由此可看出,傳入的Context的目的是獲取一個字符串類型的包名,而這個包名是什么的包名呢?

啟動一個新的 Activity 是靠系統級別的 ActivityManager 來操作的,ActivityManager 在獲得能夠定位具體的 Activity 的信息(應用的包名和目標的完整類名)之后,找到那個 Activity 并實例化它。

這里的報名實際指的是目標類的包名。

引用網友的論證過程

假設結構如下

包:com.package1----》Activity1,Activity2

包:com.package2----》ActivityA,ActivityB

誤解: 認為Context是調用方,以前一直在一個包中調用如,package1包中,Activity1調用Activity2,Intent.setClass(this,Activit2)這樣不出問題的。

可是如果跨包掉,在Activity1中調用ActivityA,就出現錯位了。

結論: Context是被調用方的 ,?Context得到包名,class得到類名,來唯一確定Activity

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容