2012-06-09 39 views
10

我有兩個Android應用程序,假設它們是「A」和「B」,「A」有五個活動,我想從「B」按鈕點擊事件調用它的特定活動。 我測試從另一個調用一個應用程序是這樣的:Android:另一個應用程序的調用活動

Intent LaunchIntent = getPackageManager().getLaunchIntentForPackage("com.testapp.ws"); 
startActivity(LaunchIntent); 

「com.testapp.ws」是「A」包名。

這會從第一次活動再次運行「A」,而不是從特定活動中運行。 我該如何撥打A的指定活動?

回答

30

格蘭特,

這裏的問題顯然是對Android應用程序模型的誤解。 Commonsware對於如何解決這個問題是絕對正確的。但是,如果不理解Android基礎知識,我可以看到爲什麼您難以應用它。所以,快速解釋:

Android中的每個操作都以Intent開始。活動尤其如此。每個活動都有一個意圖。爲了讓開發人員可以輕鬆使用界面,您可以從操作系統響應Intent,或者可以從Activities類創建一個Intent以供使用。一般來說,最好的做法是做第一個選擇。

響應一個Intent

當選擇的意向作出迴應,你可以從字面上任何意圖做出迴應。這被稱爲行動。如果我創建了一個名爲「FOO」的Intent,則小節活動可以提取並響應。然而,我們有一些約定,其中主要的一點就是將你的軟件包名稱添加到你製作的任何意圖中。例如「com.company.package.FOO」。簡而言之,這是爲了避免與其他應用程序發生衝突。

每個Activity都可能響應不同的事件。這是在AndroidManifest.xml中定義的。

<activity android:name="Activity3" ... > 
    <intent-filter> 
     <action android:name="com.company.package.FOO"/> 
     <category android:name="android.intent.category.DEFAULT" /> 
    </intent-filter> 
</activity> 

上面,我們還可以設置類別默認值,因此,除非用戶改變它,我們會是響應我們的定製意向的唯一的應用程序。我們隨後致電意圖的方法是使用我們創建的同名(即「com.company.package.FOO」)

startActivity(new Intent("com.company.package.FOO")); 

這就是它是如何工作!您只需將上面的「com.company.package.FOO」更改爲您的軟件包名稱(由您的應用程序定義)以及一些有意義的內容。一個例子是「com.testapp.ws.SWAT_FLIES」。

爲什麼您的代碼不起作用

Intent LaunchIntent = getPackageManager().getLaunchIntentForPackage("com.testapp.ws"); 

上面的代碼查找意向行動的特定種類。記住,當你所做的AndroidManifest和第一活動你就把:

<action android:name="android.intent.action.MAIN"> 
<category android:name="android.intent.category.LAUNCHER"> 

嗯...... getLaunchIntentForPackage()只獲取用於第一個活動的意圖。這就是爲什麼我們要制定一個定製的意圖......首先,因爲我們並不真的希望它成爲我們的第三個活動,我們要啓動......第二,因爲操作系統只會告訴我們啓動活動。我們有我們自己的行動來告訴它(即「com.testapp.ws.SWAT_FLIES」)

希望這有助於

FuzzicalLogic

+0

感謝Mr.Fuzzical Logic提供的詳細說明。在提到您的解釋後,我已成功實施了該應用。非常感謝! – Grant

+0

如果我想將數據從一個應用程序中的一個活動發送到另一個應用程序中的服務,這將如何實現? – Aada

+0

實際上,在啓動startService()之前,您只需要Intent ACTION並通過setExtra發送數據。你可能必須首先構建意圖(即意圖myIntent =新的意圖(「com.company.app.ACTION」) –

20

第1步:添加<intent-filter>與自定義操作的第三個活動:

<intent-filter> 
    <action android:name="com.testapp.ws.SOMETHING_USEFUL"/> 
    <category android:name="android.intent.category.DEFAULT" /> 
</intent-filter> 

第2步:使用適當Intent啓動該活動:

startActivity(new Intent("com.testapp.ws.SOMETHING_USEFUL")); 
+0

我要補充什麼這裏 ?? xml和Activity類中的「SOMETHING_USEFUL」?你能解釋更多嗎?謝謝! – Grant

+1

「類別」呢,這裏有必要嗎? –

+1

@ Eng.Fouad:嗯,是的,你需要一個''元素作爲''中的'DEFAULT'類別 - 我的道歉。 – CommonsWare

0

有,你可以不使用兩個應用程序,您的情況專門有編輯功能,或者您可能不想讓定製意圖,所以在這種情況下,還存在另一種(與可用性更好的錯誤檢查):

Intent intent = new Intent(); 
intent.setClassName("PACKAGE_NAME", "PACKAGE_NAME.TARGET_ACTIVITY"); 
if (isCallable(context, intent)) { 
    // Attach any extras, start or start with callback 
} else { 
    // Respond to the application or activity not being available 
} 

某處在主類或者一個子類,手柄一般方法:

public static boolean isCallable(Activity activity, Intent intent) { 
    List<ResolveInfo> list = activity.getPackageManager().queryIntentActivities(intent,PackageManager.MATCH_DEFAULT_ONLY); 
    return list.size() > 0; 
} 
1

這裏是從另一個應用程序

公共類MainActivity擴展活動{

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    Button bClock = (Button) findViewById(R.id.button1); 
    bClock.setOnClickListener(new OnClickListener() { 
    public void onClick(View v) { 
    Intent i = new Intent(Intent.ACTION_MAIN); 
    PackageManager managerclock = getPackageManager(); 
    i = managerclock.getLaunchIntentForPackage("com.whatsapp"); 
    i.addCategory(Intent.CATEGORY_LAUNCHER); 
    startActivity(i); 
    } 
    }); 

} }打開應用(例如WhatsApp的)代碼

相關問題