2017-09-29 103 views
0

我推出活動B通過深層鏈接,我期待活動A將在上按鈕單擊啓動。向上按鈕不起作用,如果活動延伸AppCompatActivity

這裏是我的清單

<activity 
    android:name=".ui.activity.B" 
    android:label="@string/title_activity_search" 
    android:parentActivityName=".ui.activity.A" > 

    <meta-data 
     android:name="android.support.PARENT_ACTIVITY" 
     android:value=".ui.activity.A"/> 
     ... 
     <!-- deep link --> 
     ...  
</activity> 

B活動代碼是在這裏。

public class B extends AppCompatActivity { 
    @Override 
    protected void onCreate(@Nullable Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
Toolbar vToolbar = ((Toolbar) findViewById(R.id.toolbar)); 
     setSupportActionBar(vToolbar); 
     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
     getSupportActionBar().setDisplayShowHomeEnabled(true); 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
     // Respond to the action bar's Up/Home button 
     case android.R.id.home: 
      NavUtils.navigateUpFromSameTask(this); 
      return true; 
     } 
     return super.onOptionsItemSelected(item); 
    } 
} 

您可以複製/粘貼此代碼,它的工作原理,如果活動B延伸FragmentActivity。但我需要這個與AppCompatActivity合作。我究竟做錯了什麼?

回答

2

您正在從其他應用程序打開您的Activity。所以在堆棧中沒有其他Activity可用。因此,當您按下向上按鈕時,不應讓父母Activity出現在前面。如果目標父活動在任務的後退堆棧中,則將其提前。來自開發商documentation

但是,使用navigateUpFromSameTask()只適合當你的應用程序 是當前任務的所有者(即,用戶開始從您的應用程序這個 任務)。如果這不是真的,並且您的活動在屬於其他應用的任務中啓動了 ,那麼導航Up應該 會創建屬於您的應用的新任務,這需要您創建新的後退堆棧。

所以在你的情況下,你需要做一些這樣的事情在文檔中說明。

如果您的活動提供任何意圖過濾器允許其他應用程序來 啓動活動,您應該實現onOptionsItemSelected() 回調例如,如果用戶從其他應用程序的任務進入 您的活動後,按向上鍵,你的在導航之前,應用程序會啓動一個新任務,其中 爲合適的後退堆棧。

您可以通過先調用shouldUpRecreateTask()檢查 在不同的應用程序的 任務是否存在當前活動實例這樣做。如果它返回true,則使用 TaskStackBuilder構建一個新任務。否則,您可以使用上面顯示的方法 navigateUpFromSameTask()

@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

shouldUpRecreateTask()的返回false,是否應該在深層鏈接返回true?這就是爲什麼只有最後一行NavUtils.navigateUpTo(this,upIntent);被執行 –