6

私は2つの起動方法を持つAndroidアプリを開発しています。1つは、電話のアプリアイコンを押す通常の方法です。もう 1 つの方法は、Web サイトからのディープ リンクを使用する方法です。

ディープリンクは、アプリが何らかの「処理」を行うために必要なデータも送信します。ただし、これは一度だけ行う必要があります。ディープリンク アクティビティが終了すると、メイン アクティビティが開始されます。ただし、(デバイスで) 押し戻して最近のアプリを開くと、ディープリンク アクティビティが再び開きます。

マニフェストの最近のアクティビティからディープリンク アクティビティを除外できます。これにより、最近のアプリからのメインアクティビティも除外されますが、そうではありません。

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

私のマニフェスト:

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

編集: この投稿は重複としてマークされました: Android: 「最近のアプリケーション」からアプリを起動すると、インテントで使用されたエクストラの最後のセットで起動します

ただし、その投稿は同じ活動に関するものです。ルート アクティビティを変更したいので、最近のアクティビティからアプリを起動すると、DeeplinkActivity が起動しません。はい、回避策として Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY フラグを確認できます。ただし、ユーザーが最近のアプリからアプリを起動するたびに、不要になった DeeplinkActivity が開かれます。

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

これでも重複していると思われる場合は、説明してください。

4

1 に答える 1

5

あなたの問題は、両方DeepLinkActivityMainActivity同じタスクにあることです。そのため、ユーザーが最近のタスクのリストからアプリを選択すると、Android は既存のタスクをフォアグラウンドに表示するか、既存のタスクがない場合 (ライブ/アクティブなアクティビティを使用)で)、最新のタスクでActivityルートだった を開始します。ユーザーがどちらを最初に選択したかに応じて、タスクは または のいずれかで開始される可能性があるため、どちらがroot になるActivityかを予測することはできません。ActivityActivityDeepLinkActivityMainActivity

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

投稿されたマニフェストにはこれが表示されていませんが、 ACTION=MAIN および CATEGORY=LAUNCHER があると思いMainActivityます。<intent-filter>

マニフェストは次のようになります。

<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>

あなたは間違いなく必要launchMode="singleTask"MainActivityはなく、おそらくDeepLinkActivityどちらにも必要ありません(これは、これで他に何をするかによって異なります)。

指定taskAffinity=""すると、DeepLinkActivityが と同じタスクで起動されず、別のタスクでからMainActivity起動できるようになります。注: を指定しないと、両方のアクティビティを指定しても、両方のアクティビティが同じタスクになります。MainActivityDeepLinkActivitytaskAffinitylaunchMode="singleTask"

excludeFromRecents="true"onを指定すると、ルート アクティビティとしてのタスクが最近のタスクのリストに表示されないようにDeepLinkActivityAndroid に指示します。DeepLinkActivity

MainActivityから起動するときはDeepLinkActivity、次のようにする必要があります。

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

を呼び出していることを確認してfinish()くださいDeepLinkActivity

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

これが明確で、あなたにとってうまくいくかどうか教えてください。

于 2016-10-12T20:20:56.217 に答える