2015-04-21 24 views
6

我從通知抽屜中的通知開始活動 - 他們有父活動 - 。兒童活動已啓用導航。當點擊向上導航按鈕時,我希望子活動返回到父活動。此行爲適用於正常的應用程序流。但是,當用戶通過通知輸入子活動時,單擊向上導航按鈕不會將用戶帶到父活動;相反,它結束了應用程序。從通知中啓動的兒童活動在向上導航中不會返回給父母

以下是單擊通知時應啓動的活動清單。它有一個父TabbedActivity

<activity 
    android:name=".activity.AnimalDetailsActivity" 
    android:parentActivityName=".activity.TabbedActivity" > 
<meta-data 
    android:name="android.support.PARENT_ACTIVITY" 
    android:value=".activity.TabbedActivity"/> 
</activity> 

這裏是我產生了通知,並意圖:

Intent resultIntent = new Intent(context.getApplicationContext(), AnimalDetailsActivity.class); 
TaskStackBuilder stackBuilder = TaskStackBuilder.create(context.getApplicationContext()); 
stackBuilder.addParentStack(AnimalDetailsActivity.class); 
stackBuilder.addNextIntent(resultIntent); 
PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT); 

NotificationCompat.Builder builder = new NotificationCompat.Builder(context) 
    .setSmallIcon(icon_resource_id) 
    .setLargeIcon(large_icon) 
    .setContentTitle(title) 
    .setContentText(text) 
    .setContentIntent(resultPendingIntent) 
    .setAutoCancel(true); 

return builder.build(); 

然後,我把他們關

private static void sendNotifications(List<android.app.Notification> notifications) { 
    NotificationManager manager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); 
    for (android.app.Notification notification : notifications) { 
    manager.notify(++drawerId, notification); 
    } 
} 

目標活動裏面,我啓用向上按鈕箭頭和向上導航:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    getActionBar().setHomeButtonEnabled(true); 
    getActionBar().setDisplayHomeAsUpEnabled(true); 

我相信我正確地遵循指南。那麼爲什麼向上箭頭不會將用戶帶到父母活動?

回答

6

按照該documentation,你應該實現你的onOptionsItemSelected()回調如下,如果你有一個全新的背疊啓動活動:

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
    // Respond to the action bar's Up/Home button 
    case android.R.id.home: 
     Intent upIntent = NavUtils.getParentActivityIntent(this); 
     if (NavUtils.shouldUpRecreateTask(this, upIntent)) { 
      // 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(upIntent) 
        // Navigate up to the closest parent 
        .startActivities(); 
     } else { 
      // This activity is part of this app's task, so simply 
      // navigate up to the logical parent activity. 
      NavUtils.navigateUpTo(this, upIntent); 
     } 
     return true; 
    } 
    return super.onOptionsItemSelected(item); 
} 
0

要添加到接受的答案,我想補充isTaskRoot()檢查:

if (NavUtils.shouldUpRecreateTask(this, upIntent) || isTaskRoot()) { 

     /* ... */ 

} 

因爲當應用程序從通知啓動時,啓動的Activity是應用程序堆棧的一部分,但我們仍然希望爲父母創建任務。

相關問題