2012-08-25 55 views
3

在我試圖找出如何在我的應用程序中開始一個新的意圖時,我遇到了幾種表達方式。Android意圖語法

此語法返回一個運行時錯誤,即ActivityNotFound例外

Intent in = new Intent("com.something.something"); 

當然我的Android清單包含意圖過濾器中的一個動作:

<activity 
     android:name=".SecondActivity" 
     android:label="@string/title_activity_second" > 
     <intent-filter> 
      <action android:name="com.something.something" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 

此格式的工作原理:

Intent in = new Intent(MainActivity.this, SecondActivity.class); 

我也試過以下內容:

Intent in = new Intent(this, SomeActivity.class); 

這是我正在閱讀的書中推薦的。這將返回一個運行時錯誤,activitynotfound

這一個使Eclipse把我來回setClass和setClassName無限之間:

ok.setOnClickListener(new View.OnClickListener() 
    { 

     @Override 
     public void onClick(View v) 
     { 

      Intent in = new Intent(MainActivity.this, SecondActivity.class); 
      startActivity(in); 
     } 
    }); 
} 

Intent in = new Intent().setClass(this, SecondActivity.class); 

我在一個onclick方法,使用它這些之間有什麼區別,爲什麼只有其中一個爲我工作?

問候 /M

回答

8

約意向分辨率基本信息

意圖可以包含以下基本信息:

  • ACTION
  • 類別
  • DATA
  • COMPONENT

有2種方式是意圖由系統解析:

  • 明確(如果指定它使用部分)
  • 隱式(使用ACTION,類別和數據,以尋找合適的活動)

如果您指定組件(包名稱和類名稱),那麼這用於明確查找您指定的活動並將Intent發送到該活動。其他Intent數據不被使用(雖然它被傳遞給Intent中的被調用活動)。這稱爲「顯式意向解析」

如果您未指定組件,則使用ACTION,CATEGORY和DATA字段來定位一個或多個通過意向過濾器通告它們可以接受意圖的活動。這稱爲「隱式意圖解析」


爲了您的具體問題

當你這樣做:

Intent in = new Intent("com.something.something"); 

你正在創建一個意圖隱含設置的動作 「com.something.something」。如果你用這個Intent調用startActivity(),你會得到ActivityNotFoundException,因爲Android無法找到可以接受ACTION =「com.something.something」的Intent的活動。原因是你已經提供了ACTION =「com.something.something」和CATEGORY =「android.intent.category.LAUNCHER」的意​​圖過濾器,但是你沒有在你的意圖中指定CATEGORY(Android自動添加CATEGORY如果在使用startActivity()時未指定任何CATEGORY,則將「DEFAULT」設置爲意圖)。爲了使這項工作,你要麼

  • 更換CATEGORY="android.intent.category.LAUNCHER"CATEGORY="android.intent.category.DEFAULT"
  • 添加<category android:name="android.intent.category.DEFAULT" />

到意向過濾器SecondActivity


當你這樣做:

Intent in = new Intent(MainActivity.this, SecondActivity.class); 

您正在創建顯式指定組件SecondActivity的意圖。此方法的簽名是Intent(Context packageContext, Class clas)。它使用來自packageContext的包名稱和來自clas的類名稱爲該組件創建明確的Intent。如果您在活動中使用此構造函數,則可以使用this作爲第一個參數,因爲Activity延伸了Context。如果從另一個類使用此構造函數(如OnClickListener),則需要指定MyActivity.this作爲傳遞Activity實例的第一個參數,而不是OnClickListener(因爲OnClickListener未延伸Context)。


當你這樣做:

​​3210

要創建明確意向如上。這是完全一樣的使用:

Intent in = new Intent(this, SecondActivity.class); 

,因爲第一個參數必須是一個Context(擴展Context,像Activity或類)你不能做到這一點的OnClickListener內。

如果你想創建一個明確意圖,你也可以使用這個:

Intent in = new Intent().setClassName("com.something", "com.something.SecondActivity"); 

這將創建一個明確意圖,但你並不需要爲這個Context。你可以傳遞包名和類名作爲字符串(如果你知道它們的話)。

有關意向分辨率的詳細信息,請參閱:

+0

真棒,非常感謝你爲一個偉大的答案! – hacke