2015-08-24 95 views
1

這不是一個重複的問題。我只發現this問題相關,但它沒有任何工作解決方案。startActivityForResult()不適用於外部活動

我有什麼

我有兩個應用程序都是由我創造,應用程序A和B.應用我的要求是從應用程序打開一個應用B上的一個按鈕的點擊。現在,應用程序B將執行一些處理並向App A返回一個小的狀態。這應該是可能的不是嗎?

我做了什麼

Intent intent = getActivity().getPackageManager().getLaunchIntentForPackage(Config._PACKAGE); 
getActivity().startActivityForResult(intent, 6699); 

這將打開應用B完美。現在在應用B中,

Intent returnIntent = new Intent(); 
returnIntent.putExtra("STATUS", statusCode); 
setResult(RESULT_OK, returnIntent); 
finish(); 

而這是我在活動上的onActivityResult()方法。儘管我從片段開始了活動。

@Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 

     Log.d(TAG, "ON ACTIVITY RESULT"); 

     if (requestCode == 6699) { 

      if (resultCode == RESULT_OK) { 

       Log.d(TAG, "RESULT OK"); 

      } 
      if (resultCode == RESULT_CANCELED) { 

       Log.d(TAG, "RESULT NOT OK"); 

      } 
     } 
    } 

問題

onActivityResult()當我開始應用B與RESULT_CANCELLED.活動這怎麼可能被剛剛叫什麼名字?是因爲它的一項新任務嗎?

但是當我在應用程序B上調用finish(),它關閉並將我帶回應用程序A,但是這次不會調用onActivityResult()?我該如何解決這個問題?

這是一個非常基本的要求,應該有一個解決方案。

+2

從[文檔](http://developer.android.com/reference/android/app/Activity.html#startActivityForResult%28android.content.Intent,%20int%29):「如果您正在啓動的活動使用singleTask啓動模式,它將不會在您的任務中運行,因此您將立即收到取消結果「 –

+0

在其清單中沒有針對應用B中的活動提及的launchMode。那麼什麼是錯的? –

回答

1

你真的應該添加一個自定義的意圖過濾器來實現這一點。這將允許您指導您希望應用程序B執行的任務流程,與您如何使用應用程序B分開。請參閱Android docs Intent Filter瞭解如何執行此操作。基本上,你爲它們做廣告進入清單的應用程序B,這樣的事情:

<activity android:name="ShareActivity"> 
    <intent-filter> 
     <action android:name="android.intent.action.SEND"/> 
     <category android:name="android.intent.category.DEFAULT"/> 
     <data android:mimeType="text/plain"/> 
    </intent-filter> 
</activity> 

應用程序A會使用這樣的:

Intent sendIntent = new Intent(); 
sendIntent.setAction(Intent.ACTION_SEND); 
sendIntent.putExtra(Intent.EXTRA_TEXT, textMessage); 
sendIntent.setType("text/plain"); 

// Verify that the intent will resolve to an activity 
if (sendIntent.resolveActivity(getPackageManager()) != null) { 
    startActivity(sendIntent); 
} 

這些課程的需要爲您定製的應用程序。

+0

謝謝。你能提供一個關於如何完成的例子嗎?我已經發布了我在問題中所做的一切。 –

+0

我應該使用startActivity()而不是startActivityForResult()嗎? –

+0

是的,startActivityForResults是獲取信息的正確方法。 – PearsonArtPhoto

1

我終於解決了這個問題。

如果你正在開展活動使用singleTask啓動模式,它 不會在你的任務運行,因此你會立即收到 取消結果

這就是文檔說什麼。現在的想法是,如果被叫活動在新任務上啓動,結果將立即取消。在我的情況下,我從一個不同的應用程序開始一個活動,總是從一項新任務開始,不管任何launchModetaskAffinity或標誌。

每當我做這樣的事情,

Intent intent = getActivity().getPackageManager().getLaunchIntentForPackage(Config._PACKAGE); 
getActivity().startActivityForResult(intent, 6699); 

這個標誌Intent.FLAG_ACTIVITY_NEW_TASK是默認自動添加。因此,我們需要開始使用活動前清除所有標誌,

intent.setFlags(0); 

調用startActivity()之前使用它。解決方案同時很簡單和棘手。