2016-10-12 15 views
2

私は2つの方法を起動するアンドロイドアプリを開発しています。 通常の方法は、携帯電話のアプリアイコンを押すことです。 もう1つの方法は、ウェブサイトからのディープリンクです。Android:Recentsが間違ったアクティビティを開始します

デープリンクは、アプリが何らかの「もの」を行う必要があるデータも送信します。しかしこれは一度だけ行うべきです。 ディープリンクアクティビティが終了すると、メインアクティビティが開始されます。しかし、私は(デバイス上)を押して、recentsからアプリを開くと、再びディープリンク活動を開きます。

マニフェスト内のrecentsからディープリンクアクティビティを除外できます。これはまた、最近のアプリからの主な活動を排除します。これはそうであってはなりません。

最近のアプリからのディープリンクの活動が開始されないようにするにはどうすればよいですか?

私のマニフェスト:

<activity 
     android:name="MainActivity" 
     android:label="@string/app_name" 
     android:screenOrientation="portrait" 
     android:launchMode="singleTask" 
     android:theme="@style/AppTheme"> 
    </activity> 

    <activity 
     android:name="DeeplinkActivity" 
     android:label="@string/app_name" 
     android:noHistory="true" 
     android:screenOrientation="portrait" 
     android:launchMode="singleTask" 
     android:theme="@style/AppTheme"> 

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

     <intent-filter> 
      <action android:name="android.intent.action.VIEW" /> 
      <category android:name="android.intent.category.DEFAULT" /> 
      <category android:name="android.intent.category.BROWSABLE" /> 
      <data android:host="test" android:path="/" android:scheme="app_name" /> 
     </intent-filter> 
    </activity> 

私は次の操作を行いMainActivityに切り替えるには:

 Intent intent = new Intent(this, MainActivity.class); 
     intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); 
     intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); 
     intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     startActivity(intent); 

EDIT:Android: Starting app from 'recent applications' starts it with the last set of extras used in an intent

しかしそのポスト: このポストはと重複としてマークされました同じ活動に関するものです。私はルートアクティビティを変更したいので、アプリケーションを開始してからDeeplinkActivityを開始しません。回避策としてはい、Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORYフラグを確認できます。しかし、その後、ユーザーがrecentsからアプリを起動するたびにDeeplinkActivityが開かれますが、これはもはや必要ありません。

アディティブインテント値の設定またはクリアは機能していないようです。 getIntent()からの情報を使用します。getData()

これが重複しているかのように感じる場合は、説明してください。

+0

質問を再開しました。 –

答えて

1

DeepLinkActivityMainActivityの両方が同じタスクに含まれているため、ユーザーが最近のタスクのリストからアプリを選択すると、Androidは既存のタスクをフォアグラウンドに持ち込むか、既存のタスクがない場合(その中にライブ/アクティブなアクティビティがある)、最も最近のタスクでルートActivityだったActivityを開始します。ユーザーが最初に選択したタスクに応じて、DeepLinkActivityまたはMainActivityのいずれかでタスクを開始できるため、ActivityがルートActivityになるかどうかは予測できません。

これを行うには、実際に2つのタスクが必要です。 1つのタスクにはDeepLinkActivityがあり、このタスクは「最近のタスクリスト」から除外する必要があります。他のタスクはあなたのMainActivityを持っています。

MainActivityには、投稿されたマニフェストにこれが表示されていなくても、ACTION = MAINとCATEGORY = LAUNCHERの<intent-filter>があるとします。

あなたのマニフェストには、次のようになります。あなたは間違いなくMainActivityためlaunchMode="singleTask"を必要としない、あなたはおそらく(それはあなたがこれを行うほかに何かに依存します)DeepLinkActivityのいずれかのためにそれを必要としない

<activity 
    android:name="MainActivity" 
    android:label="@string/app_name" 
    android:screenOrientation="portrait" 
    android:theme="@style/AppTheme"> 
    <intent-filter> 
     <action android:name="android.intent.action.MAIN" /> 
     <category android:name="android.intent.category.LAUNCHER" /> 
    </intent-filter> 
</activity> 

<activity 
    android:name="DeeplinkActivity" 
    android:label="@string/app_name" 
    android:noHistory="true" 
    android:screenOrientation="portrait" 
    android:taskAffinity="" 
    android:excludeFromRecents="true" 
    android:theme="@style/AppTheme"> 

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

    <intent-filter> 
     <action android:name="android.intent.action.VIEW" /> 
     <category android:name="android.intent.category.DEFAULT" /> 
     <category android:name="android.intent.category.BROWSABLE" /> 
     <data android:host="test" android:path="/" android:scheme="app_name" /> 
    </intent-filter> 
</activity> 

taskAffinity=""を指定

DeepLinkActivityMainActivityと同じタスクに発射されていないことを保証し、そしてあなたが別のタスクでDeepLinkActivityからMainActivityを起動することができます。注:taskAffinityを指定しないと、両方のアクティビティは、両方ともlaunchMode="singleTask"と指定しても、同じタスクで終了します。

DeepLinkActivityexcludeFromRecents="true"を指定すると、ルートアクティビティとしてDeepLinkActivityのタスクは最近のタスクのリストに表示されません。

Intent intent = new Intent(this, MainActivity.class); 
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); 
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    startActivity(intent); 

を、あなたがDeepLinkActivityfinish()を呼び出すことを確認してください。

あなたはDeepLinkActivityからMainActivityを起動

、あなたはこれを行う必要があります。

noHistory="true"DeepLinkActivityに追加することもできますが、必要ではないと思います。ユーザーがDeepLinkActivityで、電話がかかってきた場合は、電話が終了した後にDeepLinkActivityが表示されます。 noHistory="true"と指定すると、ユーザーが着信を受け付けるとすぐにDeepLinkActivityが終了します。

これが明確で、効果があるかどうか教えてください。

+1

ありがとうございます。確かにこれは私の問題を解決する方法です。小さいサイドノートとして。 – remcoj

+0

私にとっては、noHistoryを使用する必要がありました。あなたの例では呼び出しがあるからです。ユーザーがアプリに戻ると、プロセスを再起動する必要があります。 – remcoj

関連する問題