技術支持 http://stackoverflow.com/questions/12276027/how-can-i-return-to-a-parent-activity-correctlyandroid
首先,在網上看到有人這麼寫:app
1 @Override 2 public boolean onOptionsItemSelected(MenuItem item) { 3 switch (item.getItemId()) { 4 case android.R.id.home: 5 this.getActivity().finish(); 6 return true; 7 default: 8 return super.onOptionsItemSelected(item); 9 } 10 }
這樣直接Finish()的寫法貌似可行?ide
NONONO,這種寫法只適用於你足夠肯定在關閉子Activity前,父Activity會一直存活着。this
而在更復雜的情況下(好比子Activity是從推送中啓動的),然並卵。get
因此接下來,我來給你們示範一下正確打開上一層Activity的正確姿式(摩拳擦掌string
Step. 1 首先在Manifest中關聯父子關係it
使用"android.support.PARENT_ACTIVITY"這貨來關聯:io
1 <activity android:name=".ChildActivity" 2 android:label="@string/app_name" > 3 <meta-data android:name="android.support.PARENT_ACTIVITY" 4 android:value=".ParentActivity" /> 5 </activity>
Step. 2 在子Activity中啓用向上導航按鈕meta
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 這句必須寫,不寫不調用onOptionsItemSelected setHasOptionsMenu(true); // 啓用向上導航按鈕 if (NavUtils.getParentActivityName(getActivity()) != null) { getActivity().getActionBar().setDisplayHomeAsUpEnabled(true); } }
這裏的if用來判斷子Activity是否含有父Activity,要是沒作第一步,就要跪了im
Step. 3 onOptionsItemSelected中啓動父Activity
1 @Override 2 public boolean onOptionsItemSelected(MenuItem item) { 3 switch (item.getItemId()) { 4 case android.R.id.home: 5 // 點擊返回按鈕,退回上一層Activity 6 if (NavUtils.getParentActivityName(getActivity()) != null) { 7 // 啓動父Activity 8 NavUtils.navigateUpFromSameTask(getActivity()); 9 } 10 return true; 11 12 default: 13 return super.onOptionsItemSelected(item); 14 } 15 }
到這一步,咱們就能夠愉快的啓動父Activity~
但你會發現,怎麼父Activity啓動的並非以前存在的實例,而是新實例化一個?
這並不符合咱們的需求啊,因此說關鍵是接下來一步。
Step. 4 設置launchMode
由於安卓的默認啓動Activity方式是new一個,即便存在一個實例,但仍是要new,new,new
因此咱們須要作出修改,在Manifest的父Avtivity屬性中添加一條:
android:launchMode="singleTop"
這樣就萬事OK了,(大概是)正確的打開方式~