關于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