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方法存入額外的數據信息。
如下列所示:
- public class SaveNRestoreInstanceStateActivity extends Activity {
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.save_restore_state);
- }
- @Override
- protected void onRestart() {
- super.onRestart();
- EditText et1 = (EditText) findViewById(R.id.et1);
- EditText et2 = (EditText) findViewById(R.id.et2);
- et1.setText("This is et1");
- et2.setText("This is et2");
- }
- @Override
- protected void onSaveInstanceState(Bundle outState) {
- outState.putString("et1", "This is from outState and this is et1");
- outState.putString("et2", "This is from outState and this is et2");
- super.onSaveInstanceState(outState);
- }
- @Override
- protected void onRestoreInstanceState(Bundle savedInstanceState) {
- super.onRestoreInstanceState(savedInstanceState);
- EditText et1 = (EditText) findViewById(R.id.et1);
- EditText et2 = (EditText) findViewById(R.id.et2);
- et1.setText(savedInstanceState.getString("et1"));
- et2.setText(savedInstanceState.getString("et2"));
- }
- }
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就是菜單鍵的處理方法。咋看之下,菜單鍵的處理和上下文菜單的處理方法的格式幾乎是一致的,實際操作中也是如此,不再贅述。具體示例如下:
- public class OptionMenuTestActivity extends Activity {
- private TextView text;
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- text = (TextView) findViewById(R.id.tv);
- }
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- SubMenu sub = menu.addSubMenu("0");
- sub.add("0-1").setOnMenuItemClickListener(listener);;
- sub.add("0-2").setOnMenuItemClickListener(listener);;
- sub.add("0-3").setOnMenuItemClickListener(listener);
- menu.add("1").setIcon(R.drawable.icon);
- menu.add("2");
- menu.add("4");
- menu.add("5");
- menu.add("6");
- menu.add("7");
- return true;
- }
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- text.setText(item.getTitle());
- return true;
- }
- private OnMenuItemClickListener listener = new OnMenuItemClickListener() {
- public boolean onMenuItemClick(MenuItem item) {
- text.setText(item.getTitle());
- return true;
- }
- };
- }
需要注意的是,菜單鍵所彈出的功能菜單一般都有項數限制(一般爲6項),而且不可手動修改,如果超過這個數目,那麼後面的菜單項將會被摺疊起來。
另外,無論是上下文菜單還是菜單鍵菜單,都支持嵌套子菜單SubMenu,如上例中所示。
7. onBackPressed
回退鍵的處理方法,一般用來屏蔽回退鍵或者在添加後退時的額外功能(彈出確認退出的對話框等)。