2013-07-29 62 views
0

我有一個現有的應用程序。現在我想添加一些額外的功能。額外的功能需要一些庫。如果我在我的應用程序中使用庫,應用程序大小會增加。所以我想在一個單獨的應用程序中創建這個額外的功能,然後將新的應用程序集成到我現有的應用程序中(如果我對現有應用程序進行了一些更新,那麼我必須下載整個應用程序,這是我不想要的)。我不想在一個apk中。兩者都應該是獨立的。從第一個應用程序讓我們說A,我想要在新的應用程序B中調用一個活動。我使用了intent.setComponent(),應用程序B的活動從A中調用,但是我無法從第一個應用程序中將應用程序B的結果。Android:兩個獨立應用程序集成

應用程序A

public void onClickBtnToApplicationB(View v) { 
    try { 
     final Intent intent = new Intent(Intent.ACTION_MAIN, null); 
     final ComponentName cn = new ComponentName("pakacagename","package.class"); 
     intent.setComponent(cn); 
     intent.setAction(Intent.ACTION_MAIN); 
     intent.addCategory(Intent.CATEGORY_LAUNCHER); 
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);     
     startActivityForResult(intent, REQUEST_CODE); 
    } catch (ActivityNotFoundException e) { 
    //handle Exception 
    } 
} 

public void onActivityResult(int requestCode, int resultCode, Intent intent) { 
    switch (requestCode) { 
     case REQUEST_CODE: 
      handleResult(resultCode, intent); 
      break; 
    } 
} 

public void handleResult(int resultCode, Intent intentResult) { 
    switch (resultCode) { 
     case RESULT_OK: 
      String Result = intentResult.getStringExtra("RESULT"); 
      // I need Results from Application B here.. 
      break; 

     case RESULT_CANCELED: 
      break; 
    } 
    } 

應用B: 在應用程序B,1點開始對結果2.class另一個活動,並獲得滿意的結果。收到結果後,它們將返回到處理結果方法'putextras中的第一個應用程序。所以我需要在應用程序A的handleresult方法中得到結果,這是我沒有得到的。

Intent s = new Intent(1.this,2.class); 
startActivityForResult(s, REQUEST_CODE_B); 
protected void onActivityResult(int requestCode, int resultCode, Intent intentResult) {  
    switch(requestCode){ 
     case REQUEST_CODE_B: 
      handleResult(resultCode, intentResult); 
    } 
} 

public void handleResult(int resultCode, Intent intentResult) { 
    switch (resultCode) { 
    case RESULT_OK: 
     String scanResult = intentResult.getStringExtra("RESULT"); 
     Intent newintent = new Intent(); 
     newintent.putExtra("RESULT", scanResult); 
     setResult(Activity.RESULT_OK, newintent); 
     finish(); 
     break; 

    case RESULT_CANCELED: 
     break; 
} 
+0

如果沒有看到代碼,我們無法幫助您。 – BoD

+0

@BoD代碼現在可用 – Shah

+0

是否調用onActivityResult? – BoD

回答

0

它看起來像onActivityResult對你的活動A永遠不會被調用。

我敢打賭,這與你如何叫做活動B有關。

而不是做這個的:

final Intent intent = new Intent(Intent.ACTION_MAIN, null); 
    final ComponentName cn = new ComponentName("pakacagename","package.class"); 
    intent.setComponent(cn); 
    intent.setAction(Intent.ACTION_MAIN); 
    intent.addCategory(Intent.CATEGORY_LAUNCHER); 
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);     
    startActivityForResult(intent, REQUEST_CODE); 

,你真的應該這樣做只是這樣的:

Intent intent = new Intent(ACTION_B); 
    startActivityForResult(intent, REQUEST_CODE); 

與ACTION_B是形式"com.mypackage.myapp.ACTION_B"的和恆定的,你必須在B的聲明如下所示:

<activity 
     android:name="com.yourpackage.b.BActivity" 
    > 
     <intent-filter> 
      <action android:name="com.mypackage.myapp.ACTION_B" /> 
      <category android:name="android.intent.category.DEFAULT" /> 
     </intent-filter> 
    </activity> 
+0

它仍然不能解決問題。其結果幾乎相同。之前完成上一個活動後,它顯示Application A屏幕,但現在從Application B返回後顯示黑屏。我在onActivityResult中打印了一些文本,但logcat沒有顯示任何意味着未調用onActivityResult的內容。 P.S:我是Android的新手。 – Shah

+0

如果你能幫助我這裏。我被卡住了。 – Shah

0

,你必須從目前的意圖傳遞一些數據到新的2意圖設計,你可以這樣做:

Intent i = new Intent(yourcurrentactivity.this, yournewactivity.class); 
        // following line is an example of passing data to the new intent. 
     i.putExtra(getString(R.string.str_selecteddialog), "1"); 
     startActivity(i); 
     this.finish(); 

在新的意圖,你在OnCreate已經開始你需要從包中檢索數據:

Bundle extras = getIntent().getExtras(); 
    if (extras != null) { 
     // Log.i(TAG, " 022:... we got some extras"); 
     str_selecteddialog = getIntent().getStringExtra(getString(R.string.str_selecteddialog)); 

很明顯,你必須把這種類型的代碼到兩個意圖和反向活動名稱。我也會使用try命令來捕捉任何沒有被重視的額外問題。這種情況一開始就存在。

有不同類型的放置和獲得'額外'依賴於變量類型。爲了避免混淆,我還會使用一組變量(名稱值對,即Extras)傳遞給意圖B和一個從意圖B傳遞到意向A的不同集合。

此外,您還需要每次只能運行一個實例,這可以通過兩種方式完成。在內部各關閉了上述活動的清單,你可以指定:

android:launchMode="singleTop" 

或右邊開始其他意圖之前把這個startActivity前:

Intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 

一種或兩種這些都將只保留每一個意圖在堆棧上,而不是每個的倍數。

此外,爲了以防萬一,如果你想重新啓動當前的意圖看Restarting the current intent

希望這有助於。