【Android開發筆記】返回上層Activity的正確打開方式


技術支持 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了,(大概是)正確的打開方式~

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM