До родительской активности - на 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, откуда я создал это решение.