2015-10-28 60 views
-2

我知道2種方式來創建一個Intent,它們分別是:方法來創建一個意圖:

Intent intent = new Intent(this, Activity2.class); 
startActivity(intent); 

而且

Intent intent = new Intent(); 
intent.setClassName(com.example.android.somepackagename, com.example.android.somepackagename.Activity2); 
startActivity(intent); 

據我所知,雙方基本上做同樣的事情,不知道是否有是否存在幕後差異,以及是否存在我們只需要使用一種類型的特殊情況。

謝謝

回答

8

據我所知,基本上都做同樣的事情

不,他們正是同樣的事情......如果com.example.android.somepackagename是你自己的包。

兩個參數的構造函數的實現是:

public Intent(Context packageContext, Class<?> cls) { 
    mComponent = new ComponentName(packageContext, cls); 
} 

setClassName()實現是:

public Intent setClassName(String packageName, String className) { 
    mComponent = new ComponentName(packageName, className); 
    return this; 
} 

它們都設置ComponentName。如果進入ComponentName源文件,那麼採用Context的文件只需在Context上調用getPackageName()並使用String

setClassName()可以用來創建一個Intent,它標識一個單獨包中的組件,而您的構造函數不能。這是相當少見的,因爲我們通常使用隱含的Intents(例如,new Intent(Intent.ACTION_VIEW, uri))來查找和調用來自其他應用程序的組件。

0

兩種方式基本相同。就在第二種情況下,您明確提到包括包名的完整活動路徑。但是,兩者都會保證執行。另外請注意,在這些情況下,您的活動不需要指定的意圖過濾器。

然而,還有另一種方式

意向書I =新意圖( 「android.intent.action.someactivity」);

在這種情況下,您需要指定一個ACTION名稱。在這裏,你的一些活動必須有一個意圖過濾器,採取相同的行動。重要的是要注意,如果另一個應用程序的活動具有具有相同操作名稱的意向過濾器,那麼啓動該活動時,用戶將獲得一個活動選擇器對話框以選擇要使用哪一個。

相關問題