android中那些不得不重寫的函數

1.   onCreate, onStart, onResume, onPause, onStop, onRestart, onDestroy

如果連這7個方法都不清楚的話,那麼就該從頭開始看Android了。下圖是Activity的生命週期,加深記憶用:


2.   onNewIntent

在AndroidManifest.xml將某activity的android: launchMode設置爲singleTask或singleTop的情況下,當需要開啓(startActivity)這個activity的時候,如果當前應用的Activity棧中已經存在了該activity,那麼該activity將不會按照

onCreate  →  onStart  →  onResume

的順序啓動新的activity,而是會按照

onNewIntent   →  onResume

的順序將Activity棧中已經存在的那個Activity實例調用到最前臺。

調用startActivity方法時傳遞的intent參數會作爲onNewIntent方法的參數被使用,而Activity類本身通過getIntent方法返回的intent變量則是初始的intent值,從onNewIntent方法無關,除非調用startActivity之前通過setIntent設置intent,以保持intent總是最新的intent。

3.   onSaveInstanceState與onRestoreInstanceState

當設備的配置(橫豎屏、語言等)發生變化而使Activity自動重啓,或者Activity從前臺轉到後臺(如,按下Home鍵)的時候,Activity會調用onSaveInstanceState(Bundle)方法將當前Activity的狀態保存到一個Bundle變量中。這個Bundle變量與onCreate(Bundle)方法和onRestoreInstanceState(Bundle)中的Bundle參數是同一個,也就是說,後兩個方法通過傳入的Bundle參數還原Activity的狀態。

不過,雖然Activity的狀態保存到了Bundle中,但是這些狀態數據卻無法從Bundle中取出。要想手動地設置一些重啓後需要的狀態數據,可以直接調用該Bundle實例的putXXX方法存入額外的數據信息。

如下列所示:

[java] view plaincopy
  1. public class SaveNRestoreInstanceStateActivity extends Activity {  
  2.     /** Called when the activity is first created. */  
  3.     @Override  
  4.     public void onCreate(Bundle savedInstanceState) {  
  5.         super.onCreate(savedInstanceState);  
  6.         setContentView(R.layout.save_restore_state);  
  7.     }  
  8.   
  9.     @Override  
  10.     protected void onRestart() {  
  11.         super.onRestart();  
  12.         EditText et1 = (EditText) findViewById(R.id.et1);  
  13.         EditText et2 = (EditText) findViewById(R.id.et2);  
  14.           
  15.         et1.setText("This is et1");  
  16.         et2.setText("This is et2");  
  17.     }  
  18.   
  19.     @Override  
  20.     protected void onSaveInstanceState(Bundle outState) {  
  21.         outState.putString("et1""This is from outState and this is et1");  
  22.         outState.putString("et2""This is from outState and this is et2");  
  23.           
  24.         super.onSaveInstanceState(outState);  
  25.     }  
  26.   
  27.     @Override  
  28.     protected void onRestoreInstanceState(Bundle savedInstanceState) {  
  29.         super.onRestoreInstanceState(savedInstanceState);  
  30.           
  31.         EditText et1 = (EditText) findViewById(R.id.et1);  
  32.         EditText et2 = (EditText) findViewById(R.id.et2);  
  33.           
  34.         et1.setText(savedInstanceState.getString("et1"));  
  35.         et2.setText(savedInstanceState.getString("et2"));  
  36.     }  
  37.   
  38. }  

4.   onCreateDialog與onPrepareDialog

雖然onCreateDialog、onPrepareDialog方法,以及相關的調用方法showDialog、dismissDialog、removeDialog在API Level 11以後遭到廢棄,但是對於2.2(Level 8)、2.3.1(Level 9)和2.3.3(Level 10)中卻仍然是必不可少的。

簡單地說onCreateDialog和onPrepareDialog就與onCreate和onStart方法之間的關係類似,onCreateDialog負責在彈出框還不存在時生成彈出框Dialog,而onPrepareDialog則是在Dialog顯示前對其進行進一步的處理。

這裏需要特別注意的是:使用removeDialog方法後,彈出框會被清除,下一次在本Activity中使用showDialog首先會調用onCreateDialog,然後再調用onPrepareDialog;而如果只使用dismissDialog方法使彈出框不可見,彈出框並不會被清除,下次調用showDialog時也不會調用onCreateDialog。

5.   onCreateContextMenu與onContextItemSelected

上下文菜單(ContextMenu)的實際效果是,長按某一個View控件之後彈出一個可選的菜單。ContextMenu相對真正的長按事件(OnLongClickListener)中彈出菜單的優點在於使用非常靈活,代碼也相對集中。但是需要通過registerForContextMenu綁定View控件之後才能生效。

onCreateContextMenu方法的原型是:

void  onCreateContextMenu(ContextMenu  menu, View  v, ContextMenuInfo  menuInfo);

其中的ContextMenu  menu就是最終會顯示的上下文菜單,需要在控件上進行的UI操作都需要在menu上進行;View  v是觸發上下文菜單的View控件。

另一個方法onContextItemSelected,是用來處理上下文菜單中的選中事件的。其參數是MenuItem,也就是ContextMenu中的選中項,可以通過在onCreateContextMenu中設置的groupId、itemId、order或者title來加以區分。

6.   onCreateOptionsMenu與onOptionsItemSelected

雖然Android 4.0之後要取消菜單鍵,但是現在菜單鍵仍然非常有用。onCreateOptionsMenu就是菜單鍵的處理方法。咋看之下,菜單鍵的處理和上下文菜單的處理方法的格式幾乎是一致的,實際操作中也是如此,不再贅述。具體示例如下:

[java] view plaincopy
  1. public class OptionMenuTestActivity extends Activity {  
  2. private TextView text;  
  3.       
  4.     /** Called when the activity is first created. */  
  5.     @Override  
  6.     public void onCreate(Bundle savedInstanceState) {  
  7.         super.onCreate(savedInstanceState);  
  8.         setContentView(R.layout.main);  
  9.           
  10.         text = (TextView) findViewById(R.id.tv);  
  11.     }  
  12.   
  13.     @Override  
  14.     public boolean onCreateOptionsMenu(Menu menu) {  
  15.         SubMenu sub = menu.addSubMenu("0");  
  16.         sub.add("0-1").setOnMenuItemClickListener(listener);;  
  17.         sub.add("0-2").setOnMenuItemClickListener(listener);;  
  18.         sub.add("0-3").setOnMenuItemClickListener(listener);  
  19.         menu.add("1").setIcon(R.drawable.icon);  
  20.         menu.add("2");  
  21.         menu.add("4");  
  22.         menu.add("5");  
  23.         menu.add("6");  
  24.         menu.add("7");  
  25.           
  26.         return true;  
  27.     }  
  28.       
  29.     @Override  
  30.     public boolean onOptionsItemSelected(MenuItem item) {  
  31.         text.setText(item.getTitle());  
  32.         return true;  
  33.     }  
  34.       
  35.     private OnMenuItemClickListener listener = new OnMenuItemClickListener() {  
  36.   
  37.         public boolean onMenuItemClick(MenuItem item) {  
  38.             text.setText(item.getTitle());  
  39.             return true;  
  40.         }  
  41.           
  42.     };  
  43. }  

需要注意的是,菜單鍵所彈出的功能菜單一般都有項數限制(一般爲6項),而且不可手動修改,如果超過這個數目,那麼後面的菜單項將會被摺疊起來。

另外,無論是上下文菜單還是菜單鍵菜單,都支持嵌套子菜單SubMenu,如上例中所示。

7.   onBackPressed

回退鍵的處理方法,一般用來屏蔽回退鍵或者在添加後退時的額外功能(彈出確認退出的對話框等)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章