14

選択するとアクティビティを開始する通知を発行するアプリケーションがあります。Android docs によると、 NavUtils.shouldUpRecreateTask を使用して、アクティビティが直接 (通知から) 開始されたか、通常のアクティビティ スタックを介して開始されたかを確認できます。しかし、それは間違った答えを出します。これを JellyBean でテストしていますが、サポート ライブラリを使用しています。

基本的に、通知からアクティビティが開始された場合でも、shouldUpRecreateTask は常に false を返します。

shouldUpRecreateTask が正しい答えを出せない理由について何か考えはありますか?

4

3 に答える 3

7

これは正しくありません。通知から開始する場合、ここで説明するように、通知を作成するときにスタックを作成する必要があります: http://developer.android.com/guide/topics/ui/notifiers/notifications.html#NotificationResponse

したがって、通知を作成するときは、次のことを行う必要があります。

Intent resultIntent = new Intent(this, ResultActivity.class);
// ResultActivity is the activity you'll land on, of course
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
// Adds the back stack
stackBuilder.addParentStack(ResultActivity.class);
// Adds the Intent to the top of the stack
// make sure that in the manifest ResultActivity has parent specified!!!
stackBuilder.addNextIntent(resultIntent);
// Gets a PendingIntent containing the entire back stack
PendingIntent resultPendingIntent =
        stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);

UP ボタンをクリックすると、次の通常のコードが必要になります。

if (NavUtils.shouldUpRecreateTask(this, intent)) {
    // This activity is NOT part of this app's task, so
    // create a new task when navigating up, with a
    // synthesized back stack.
    TaskStackBuilder.create(this)
    // Add all of this activity's parents to the back stack
            .addNextIntentWithParentStack(intent)
            // Navigate up to the closest parent
            .startActivities();
} else {
    NavUtils.navigateUpTo(this, intent);
}

これは私にとって完璧に機能します。

于 2014-01-08T10:29:43.417 に答える
5

なぜ shouldUpRecreateTask が失敗するのかはまだわかりません。ソース コードを調べてもあまり役に立ちません。しかし、解決策は非常に簡単です。通知に添付されているインテントに追加のフラグ値を追加し、onCreate() でこれをチェックするだけです。設定されている場合、Activity は通知から呼び出されているため、バック スタックを再作成する必要があります。

コードは次のようになります。

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Bundle b = getIntent().getExtras();
    fromNotification = b.getInt("fromNotification") == 1;
    setContentView(R.layout.threadlist);
}

@Override
public boolean onHomeButtonPressed() {
    if(fromNotification) {
        // This activity is not part of the application's task, so create a new task
        // with a synthesized back stack.
        TaskStackBuilder tsb = TaskStackBuilder.from(this)
                .addNextIntent(new Intent(this, COPAme.class));
        tsb.startActivities();
    } 
        // Otherwise, This activity is part of the application's task, so simply
        // navigate up to the hierarchical parent activity.
    finish();
    return true;
}
于 2013-01-25T13:05:35.373 に答える