До родительской активности - на Android
После получения уведомления в моем приложении щелчок по нему открывает активность B. Активность B имеет родительскую активность A. Вот манифест:
<activity
android:name="com.evapp.activities.B"
android:label="@string/title_activity_B"
android:parentActivityName="com.evapp.activities.A"
android:screenOrientation="portrait" >
<!-- Parent activity meta-data to support 4.0 and lower -->
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.evapp.activities.A" />
</activity>
В действии B у меня включена активированная функциональность (стрелка влево возле значка панели действий), вот код:
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
getActionBar().setDisplayHomeAsUpEnabled(true);
...
Проблема заключается в том, что если активность B была открыта, нажав на уведомление (активность A была не та, которая принесла активность B), при нажатии на значок приложение закрывается. Я хотел бы открыть его родительскую деятельность, А. Возможно ли это? или я должен делать это с помощью startActivity()
из действия B?
Обновление 1 - Я добавил этот код:
@Override
public boolean onOptionsItemSelected(MenuItem item)
{
switch (item.getItemId())
{
case android.R.id.home:
Intent upIntent = NavUtils.getParentActivityIntent(this);
if (NavUtils.shouldUpRecreateTask(this, upIntent))
{
TaskStackBuilder.create(this)
.addNextIntentWithParentStack(upIntent)
.startActivities();
}
else
{
NavUtils.navigateUpTo(this, upIntent);
}
return true;
Спасибо
Ответы
Ответ 1
Вам нужно настроить PendingIntent
, который используется для сборки Notification
, чтобы запустить новую задачу, и предоставить PendingIntent
с помощью back stack
для достижения нормальной работы приложения.
Intent resultIntent = new Intent(this, SecondActivity.class);
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
// All the parents of SecondActivity will be added to task stack.
stackBuilder.addParentStack(SecondActivity.class);
// Add a SecondActivity intent to the task stack.
stackBuilder.addNextIntent(resultIntent);
// Obtain a PendingIntent for launching the task constructed by this builder.
PendingIntent pendingIntent = stackBuilder.getPendingIntent(REQUEST_CODE, PendingIntent.FLAG_UPDATE_CURRENT);
NotificationManager manager = (NotificationManager) this.getSystemService(NOTIFICATION_SERVICE);
Notification notification = new Notification.Builder(this)
.setContentTitle("My Notification")
.setContentText("Notification content")
.setSmallIcon(android.R.drawable.ic_menu_view)
.setContentIntent(pendingIntent)
.build();
manager.notify(NOTIFICATION_ID, notification);
Пожалуйста, ознакомьтесь с официальной документацией на Android Сохранение навигации при запуске Activity. Он рекомендует вышеупомянутый подход.
Ответ 2
Я использую следующий код, и он работает как шарм. Идите!
Intent upIntent = new Intent(getApplicationContext(), Home.class);
if (NavUtils.shouldUpRecreateTask(this, upIntent)) {
Log.d("ShowNotifications", "New Home");
TaskStackBuilder.create(this).addNextIntentWithParentStack(upIntent).startActivities();
} else {
Log.d("ShowNotifications", "Old Home");
upIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP);
//upIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK );
startActivity(upIntent);
finish();
}
Ответ 3
Создайте временную активность для запуска при нажатии на уведомление (без использования setContentView). Там вы можете решить, какую деятельность начать. В зависимости от вашей логики.
Ответ 4
До родительской активности - на Android
Просто вы можете запустить активность родительской активности с помощью некоторого логического аргумента, и если логический аргумент задан в действии b, тогда запустите действие A. Таким образом, оба действия будут работать в стеке или использовать taskstackbuilder.
Ответ 5
При использовании TaskStackBuilder не забудьте добавить в манифест декларацию активности родителя.
Для API 16 +:
<activity android:name=".SecondActivity"
android:parentActivityName=".MainActivity"
... />
Для API < 16
<activity android:name=".SecondActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".MainActivity" />
Ответ 6
Если решение @Manish Mulimani работало для вас, пожалуйста, не стесняйтесь игнорировать эту информацию. Это не сработало для меня, и я не пробовал код, который находится в OP, но вот альтернативное решение, если ни один из них не работал для вас:
Сначала, как и OP, укажите родительскую активность в AndroidManifest.xml:
<activity
android:name=".DetailActivity"
android:label="@string/activity_detail"
android:parentActivityName=".MainActivity" >
<!-- Parent activity meta-data to support 4.0 and lower -->
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".MainActivity" />
</activity>
Затем в коде, который вы пишете, чтобы показать свое уведомление, сделайте следующее:
/* The Intent you want to open when your notification is clicked */
Intent detailIntent = new Intent(context, DetailActivity.class);
/* If you have some extras or a URI, set it here for the DetailActivity */
detailIntent.setData(todaysWeatherUri);
/*
* This Intent is the one that goes back to your MainActivity when the up
* arrow or back button is clicked from the DetailActivity.
*/
Intent backToMain = new Intent(context, MainActivity.class);
PendingIntent resultPendingIntent =
TaskStackBuilder.create(context)
.addNextIntentWithParentStack(backToMain)
.addNextIntent(detailIntent)
.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
Я тестировал это с каждой итерацией начальных действий, которые я могу изящно и прекрасно работает! Надеюсь, это поможет вам.
Вот ссылка для документации на Android, откуда я создал это решение.