2015-06-26 57 views
1

我正在使用自定義URI方案將用戶從網站重定向到應用程序,但啓動應用程序時,它會打開一個新實例,而不僅僅是恢復已經開放了。Android - URI方案 - 停止打開應用程序的多個實例

我已經嘗試使用launchMode =「singleTask」或「singleInstance」,但他們似乎沒有影響它。

<!-- Splash. --> 
    <activity 
     android:launchMode="singleTask" 

     android:name=".Activities.Splash" 
     android:label="@string/app_name" 
     android:screenOrientation="portrait" 
     android:windowSoftInputMode="stateHidden" 
     > 

     <intent-filter> 
      <data android:scheme="customscheme" /> 
      <action android:name="android.intent.action.VIEW"/> 
      <category android:name="android.intent.category.BROWSABLE" /> 
      <category android:name="android.intent.category.DEFAULT"/> 
     </intent-filter> 

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


    </activity> 

實施例:

  1. 用戶打開應用程序,從活動A變爲活動B。

  2. 用戶打開網站,並通過URI重定向迴應用程序。

  3. 申請是現在活性A.

  4. 用戶按下返回按鈕,破壞活性A.

  5. 活動B現在從第一個實例存在。

感謝您的時間和幫助!

+0

第一:檢查你是否沒有「不保留活動」檢查...第二:*它打開一個新的實例,而不是... *你是如何確定這一點? – Selvin

+0

檢查「不要保留活動」在哪裏?而且因爲在使用應用程序時,按下後退按鈕關閉應用程序只需關閉應用程序,並在其下面顯示另一個應用程序。 –

+0

它是一些程序員/調試選項...你仍然寫了活動b出現...是一個「下」它的活動? – Selvin

回答

2

假設您沒有爲活動B設置android:taskAffinity,這是做正確的事情。

  • 當你啓動應用程序啓動ActivityA
  • ActivityA啓動ActivityB到同一個任務(即使你的ActivityB設置launchMode="singleInstance",Android將會忽略,因爲它具有相同的taskAffinity爲ActivityA)
  • 用戶打開網站,並重定向到應用程序。 Android將應用程序(包含ActivityA和ActivityB)的現有任務帶到前臺,並創建一個新的ActivityA實例並將其放在現有活動的頂部。現在你有一個ActivityA - > ActivityB - > ActivityA的任務堆棧。
  • 用戶按下BACK按鈕,該按鈕完成堆棧頂部的ActivityA實例並顯示下面的ActivityB實例。

如果您考慮這一點,Android無法打開ActivityA的現有實例,因爲它由ActivityB覆蓋。

解決此問題的方法有很多種,具體取決於您希望應用在不同情況下的行爲方式。我們假設,如果應用程序已經在運行,您希望將任務堆棧清除回ActivityA的根實例,並且希望重用該實例(而不是創建另一個實例)。最簡單的方法之一是讓Web瀏覽器打開另一個活動(不是ActivityA),我們稱之爲RedirectActivity。這種新的活動在其onCreate()下面的代碼:

super.onCreate(...); 
Intent intent = new Intent(this, ActivityA.class); 
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); 
startActivity(intent); 
finish(); 

此代碼將執行下列操作之一,具體取決於...

  1. 如果應用程序尚未運行,它會創建一個新的ActivityA的實例。
  2. 如果應用程序已經運行,它將清除可能位於ActivityA現有實例之上的任何活動的任務堆棧,然後它將返回到ActivityA的現有實例。

注意:還有其他行爲可能是適當的,並且您可以使用其他技術來獲得類似的行爲。

+1

謝謝!你的解釋很容易理解,我明白你在說什麼。我使用了你的RedirectActivity代碼,它運行良好。我必須更多地研究它,以便爲我想要處理的事情獲得更好的行爲,但現在它運作得非常好。再次感謝你。 –

相關問題