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);
Ответы
Ответ 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"
...
/>