NavUtils.navigateUpTo() はアクティビティを開始しません 質問する

NavUtils.navigateUpTo() はアクティビティを開始しません 質問する

私には2つの活動があります

  • MainActivity
  • DeepLinkActivity

NavUtilsアドバイスに従って上へ移動するためにすべてを設定しましたここここそしてここ

私が達成したいことは次のとおりです。

  1. DeepLinkActivityディープリンクから開始
  2. 上を押す
  3. へ移動MainActivity

最近使用したアプリに自分のアプリのタスクがある限り、すべて正常に動作します。

ただし、最近使用したアプリからアプリをスワイプすると、次のように動作します。

  1. 最近使ったアプリからアプリをスワイプして消す
  2. DeepLinkActivityディープリンクから開始
  3. 上を押す
  4. 戻るボタンを押すとアプリが閉じる

コードをデバッグして、 がNavUtils.shouldUpRecreateTask()を返すことがわかりましたfalseupIntent私の設定と同様に、すべてが通常に設定されていますComponent。しかし、それでも のNavUtils.navigateUpTo()呼び出しと同じように動作しますfinish()。ログ ステートメントも何も表示されません。

それをどう修正するか、何かアイデアはありますか?

AndroidManifest.xml

<activity
    android:name=".DeepLinkActivity"
    android:parentActivityName="my.package.MainActivity">
    <meta-data
        android:name="android.support.PARENT_ACTIVITY"
        android:value="my.package.MainActivity"/>
    <intent-filter>
        <!-- Some intent filter -->
    </intent-filter>
</activity>

ディープリンクアクティビティ.java

@Override
public boolean onOptionsItemSelected(final MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            Intent upIntent = NavUtils.getParentActivityIntent(this);
            if (NavUtils.shouldUpRecreateTask(this, upIntent)) {
                // create new task
                TaskStackBuilder.create(this).addNextIntentWithParentStack(upIntent)
                        .startActivities();
            } else {
                // Stay in same task
                NavUtils.navigateUpTo(this, upIntent);
            }
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

- - - 編集 - - -

いくつかの Google アプリが同じように壊れていることに気付きました。たとえば、検索から連絡先にジャンプする場合、AB で上を押すと、連絡先アプリではなくホーム画面が表示されます。(API19/cm11)

ベストアンサー1

OP の問題に対する私の解決策:

public void navigateUp() {
    final Intent upIntent = NavUtils.getParentActivityIntent(this);
    if (NavUtils.shouldUpRecreateTask(this, upIntent) || isTaskRoot()) {
        Log.v(logTag, "Recreate back stack");
        TaskStackBuilder.create(this).addNextIntentWithParentStack(upIntent).startActivities();
    } else {
        NavUtils.navigateUpTo(this, upIntent);
    }
}

isTaskRoot()はtrueを返しますディープリンクアクティビティタスクのルートです (アプリケーションの最初の起動、またはアプリケーションはタスク マネージャーによって以前に終了されています)。この方法では、アプリケーション タスクがすでにフォアグラウンドにあるときにリンクを介してアクティビティが起動された場合、既存のバック スタックが失われることはありません。

おすすめ記事