Подтвердить что ты не робот

Android - создайте уведомление, TaskStackBuilder.addParentStack не работает

Я пытаюсь запустить мероприятие из уведомления, как объясняют документы Android, но когда я открываю уведомление и затем нажимаю кнопку "Назад", HomeActivity (родительский) не открывается, вместо этого приложение закрывается. Что я делаю неправильно?

    Intent resultIntent = new Intent(context, MatchActivity.class);;
    resultIntent.setFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK);

    TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);

    // Adds the back stack for the Intent (but not the Intent itself)
    stackBuilder.addParentStack(MainActivity.class);

    stackBuilder.addNextIntent(resultIntent);
4b9b3361

Ответ 1

Вам нужно добавить родительский стек для запускающего действия, а не его родителя.

Заменить:

stackBuilder.addParentStack(MainActivity.class);

с:

stackBuilder.addParentStack( MatchActivity.class );

Предполагается, что вы определили родителя в манифесте (API 16 +):

<activity android:name=".MatchActivity"
    android:parentActivityName=".MainActivity"
    ... />

Если вы разрабатываете для API 16, то вам нужно определить родителя как:

<activity android:name=".MatchActivity">
    <meta-data
        android:name="android.support.PARENT_ACTIVITY"
        android:value=".MainActivity" />
</activity>

Ответ 2

Если ни одно из решений не работает, и вы уверены, что внимательно следили за ним... тогда вам нужно удалить приложение и переустановить его. Работал для меня!

Ответ 3

Использование TaskStackBuilder не помогло решить мою проблему и работает только для Honeycomb и больше. Поэтому я принимаю следующее решение (пожалуйста, не распинайте меня):

  • Вызовите MainActivity вместо MatchActivity, передав MatchActivity в качестве аргумента (по Intent).
  • В MainActivity.onCreate запустите MatchActivity, если параметр доступен.

Новый код:

Intent resultIntent = new Intent(context, MainActivity.class) //
        .putExtra(MainActivity.ACTIVITY_EXTRA, MatchActivity.class.getName()) //
        .putExtra("Pass extras to MatchActivity", "if you want! :)");

PendingIntent pendingIntent = PendingIntent.getActivity(context, visitId, resultIntent, PendingIntent.FLAG_UPDATE_CURRENT);

Notification notification = new NotificationCompat.Builder(context) //
            .setContentIntent(pendingIntent) //
            .build();

Вкл MainActivity:

public static final String ACTIVITY_EXTRA = "activity";

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (getIntent().getStringExtra(ACTIVITY_EXTRA) != null) {
        startActivity(new Intent(getIntent()).setClassName(this, getIntent().getStringExtra(ACTIVITY_EXTRA)));
    }
    ...
}

Ответ 4

Intent resultIntent = new Intent(App.getContext(), TargetActivity.class);
Intent backIntent = new Intent(App.getContext(), ParentActivity.class);
backIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
final PendingIntent resultPendingIntent = PendingIntent.getActivities(
                                    App.getContext(), 0, 
               new Intent[]{backIntent, resultIntent}, PendingIntent.FLAG_ONE_SHOT);
mNotifyBuilder.setContentIntent(resultPendingIntent);

это решило мою проблему с родительским стеком в Notification Click

Ответ 5

Заглянули ли вы в документацию на Android, в частности Notifications Руководство по API. В нем описано, как это сделать подробно.

Обратите внимание, что если действие, которое вы начинаете с уведомления, не является частью обычного потока активности, оно не должно идти на начальную страницу приложения; вместо этого он должен перейти на главный экран.

Ответ 6

Как указано в других ответах, TaskStackBuilder не работает для версий ниже Honeycomb.

Моим решением было переопределить метод onBackPressed().

@Override
public void onBackPressed() {
    NavUtils.navigateUpFromSameTask(this);
}

Очевидно, что если вы планируете завершить свою деятельность каким-то другим способом, вам тоже придется это обработать. (Хотя я предполагаю, что переопределение finish() будет иметь некоторое неожиданное поведение).

Ответ 7

Вы должны добавить это в MainActivity на AndroidManifest:

<activity
   android:name=".MainActivity"
   android:allowTaskReparenting="true" />

Ответ 8

Для меня stackBuilder.addParentStack не работает.

Я в конечном итоге делаю это, надеюсь, что это может вам помочь.

    Intent intent = new Intent(context, MatchActivity.class);

    TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);
    // Adds the back stack for the Intent
    stackBuilder.addNextIntentWithParentStack(new Intent(context, MainActivity.class));
    stackBuilder.addNextIntent(intent);
    PendingIntent pendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);

Ответ 9

У меня была такая же проблема! Решение:

переключиться на

PendingIntent resultPendingIntent = 

PendingIntent.getActivity( this, 0, resultIntent, PendingIntent.FLAG_UPDATE_CURRENT);

PendingIntent resultPendingIntent = 

stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);

Ответ 10

Если вы используете генерацию кода в своем проекте (например, Dagger), MainActivity.class следует заменить на MainActivity_.class(или независимо от имени вашего родительского действия). Принял меня целый день, чтобы понять это. Надеюсь, это может спасти кого-то день.

Ответ 11

также это может произойти, если ваша activiti в mannifest имеет следующий запускMode:

<activity android:name=".SecondActivity"
     ...
         android:launchMode="singleInstance"
         android:parentActivityName=".MainActiviy"
    ...
/>