2017-03-09 58 views
1

此問題已在類似帖子中解決,但是,我的情況有點不同。我只有一個活動,和多個片段。我不是深入鏈接到特定的片段,我啓動我的一個活動,然後重定向到不同的片段。我遇到的問題是,在單擊深層鏈接時以及在防止應用程序的多個實例打開時,應用程序的多個實例處於打開狀態,因此我失去了深層鏈接意圖中的數據。深層鏈接導致應用程序的多個實例打開

我已經阻止了多個實例的幾種方法。一個是被添加singleTop到我的清單

android:launchMode="singleTop" 

這樣可以防止多個實例,但是,從我原來的應用程序實例中的靜態數據丟失。另一種方式我也曾嘗試以下方式以及

// finishes activity if its not the root activity 
    if (!FrameworkUtils.checkIfNull(getIntent().getExtras())) { 
     if (!isTaskRoot()) { 
      finish(); 
     } 
    } 

有了這個代碼,我保持應用程序的原始實例,但目的數據我從深層鏈接需要走了,因爲應用程序的新實例(我需要)被關閉。

我怎樣才能解決這個問題,而不需要創建額外的活動推出,然後做一些像

Intent intent = getIntent(); 
    String intentUrl = intent.getDataString(); 
    Intent newIntent = new Intent(this, MainActivity.class); 
    newIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    newIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); 
    newIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
    newIntent.putExtra("intentUrl",intentUrl); 
    newIntent.setAction(Long.toString(System.currentTimeMillis())); 
    startActivity(newIntent); 
    finish(); 

或者說,我怎麼可以刪除該應用程序的原始實例,並保持的新實例用戶點擊深層鏈接後的應用程序?在此先感謝

+0

你是什麼意思'應用程序的新實例(我需要)被關閉'?這不是'singleTop'的作用。你在哪裏重寫[onNewIntent](https://developer.android.com/reference/android/app/Activity.html#onNewIntent(android.content.Intent))? – ianhanniballake

+0

我的意思是應用程序的原始實例被關閉。抱歉錯字。第二種方式是關閉應用程序的新實例。但是有兩種方法都有問題,因爲應用程序的新實例沒有來自我的靜態對象的數據。相反,如果應用程序的新實例被關閉,則原始實例不具有來自推送通知的數據。 – portfoliobuilder

+0

您的程序隨時可以隨時移除(隨着用戶從您的應用程序切換到其他應用程序,它會一直髮生在低端設備上)。無論如何你都需要能夠從中恢復。 – ianhanniballake

回答

2

請在下面找到只有一個實例的活動代碼,您也可以發送您的數據並進行處理。如果您有任何疑問,請告訴我。對於同一

<activity 
     android:name=".MyActivity" 
     android:launchMode="singleTask" 
     android:screenOrientation="portrait" 
     android:theme="@android:style/Theme.Holo.Light.NoActionBar.Fullscreen"></activity> 

使用從您的任何活動的公共靜態API startMyActivity

package example.raghavpai; 

    import android.app.Activity; 
    import android.content.Context; 
    import android.content.Intent; 
    import android.os.Bundle; 

    /** 
    * Created by RaghavPai on 09-03-2017. 
    */ 

    public class MyActivity extends Activity { 
     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      processDataFromIntent(); 
     } 

     @Override 
     protected void onNewIntent(Intent intent) { 
      super.onNewIntent(intent); 
      setIntent(intent); 
      processDataFromIntent(); 
     } 

     private void processDataFromIntent() { 
      Intent intent = getIntent(); 
      if (intent != null) { 
       Bundle extras = intent.getExtras(); 
       if (extras != null) { 
        String message = extras.getString("data_key"); 
       } 
      } 
     } 

     public static void startMyActivity(Context context, String data) { 
      Intent intent = new Intent(context, MyActivity.class); 
      intent.putExtra("data_key", data); 
      intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); 
      context.startActivity(intent); 
     } 
    } 

清單代碼。

+0

是的,我知道如何擁有1個應用程序實例。這就是你所描述的。但是這並不能完全回答我的問題,即如何在單擊深度鏈接之前保留原始靜態對象。 – portfoliobuilder

+0

爲了您明白我的意思,請保留相同的代碼,但要創建一個遞增的計數器。按下CTA觸發電子郵件的深層鏈接(例如),將該計數器增加爲1.現在最小化該應用程序,當您按下電子郵件深層鏈接並將其重定向回到您的應用程序時,您會注意到該計數器重置爲0.是的,你有一個應用程序實例,但是你保留了新實例並銷燬了原始實例。這是問題。 – portfoliobuilder

+0

對不起,我錯了。你是對的。有用! – portfoliobuilder

相關問題