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

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

相關文章
相關標籤/搜索