2017-03-09 5 views
1

この問題は同様の記事で解決されていますが、私の状況は少し異なります。私は1つだけの活動と複数の断片を持っています。私は特定の断片に逆行しません、私は私の1つの活動を開始し、別の断片にリダイレクトしています。私が実行している問題は、深いリンクをクリックするとアプリケーションの複数のインスタンスが開き、アプリケーションの複数のインスタンスが開かないようにするときに、深いリンクのためにデータを失うことです。ディープリンクにより、複数のアプリケーションインスタンスが開かれています

私は複数のインスタンスをいくつかの方法で防ぐことができました。一つは、私のマニフェスト

android:launchMode="singleTop" 

に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

私は、アプリケーションの元のインスタンスが閉じられることを意味します。申し訳ありませんがタイプミス。アプリの新しいインスタンスが2番目の方法で閉じられます。しかし、アプリの新しいインスタンスは私の静的オブジェクトからのデータを持っていないので、いずれかの方法で問題があります。逆に、アプリケーションの新しいインスタンスが閉じられると、元のインスタンスにはプッシュ通知のデータがありません。 – portfoliobuilder

+0

あなたのプロセスはいつでもいつでも削除することができます(ユーザーがあなたのアプリから他のアプリに切り替えると、ローエンドのデバイスで常に行われます)。いずれにしてもそれから回復できる必要があります。 – ianhanniballake

答えて

2

下記のアクティビティコードには1つのインスタンスのみがあり、データを送信して処理することができます。あなたが疑問を持っていれば教えてください。

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); 
     } 
    } 

あなたの活動のいずれかからのパブリック静的APIのstartMyActivityを使用して同じ

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

のマニフェストコード。

+0

はい、私はアプリの1インスタンスを持つ方法を理解しています。それがあなたが説明したものです。しかし、これはかなり深いリンクがクリックされる前に、元の静的オブジェクトを保持する方法について私の質問には答えていません。 – portfoliobuilder

+0

私が何を意味しているかを理解するために、同じコードを保持しながら、インクリメントするカウンタを作成してください。電子メールからの深いリンクをトリガーするCTAを押すと、そのカウンタが1に増えます。アプリを最小限に抑えて、電子メールのディープリンクを押してアプリケーションにリダイレクトすると、はい、アプリケーションのインスタンスは1つですが、新しいインスタンスを保持して元のオブジェクトを破棄しています。それが問題です。 – portfoliobuilder

+0

申し訳ありませんが、私は間違っています。あなたは正しいです。できます! – portfoliobuilder

関連する問題