技術支持 http://stackoverflow.com/questions/12276027/how-can-i-return-to-a-parent-activity-correctly
首先,在網上看到有人這么寫:
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()的寫法貌似可行?
NONONO,這種寫法只適用於你足夠確定在關閉子Activity前,父Activity會一直存活着。
而在更復雜的狀況下(比如子Activity是從推送中啟動的),然並卵。
所以接下來,我來給大家示范一下正確打開上一層Activity的正確姿勢(摩拳擦掌
Step. 1 首先在Manifest中關聯父子關系
使用"android.support.PARENT_ACTIVITY"這貨來關聯:
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中啟用向上導航按鈕
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 這句必須寫,不寫不調用onOptionsItemSelected setHasOptionsMenu(true); // 啟用向上導航按鈕 if (NavUtils.getParentActivityName(getActivity()) != null) { getActivity().getActionBar().setDisplayHomeAsUpEnabled(true); } }
這里的if用來判斷子Activity是否含有父Activity,要是沒做第一步,就要跪了
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了,(大概是)正確的打開方式~
