1. 程式人生 > >Android按返回鍵退出程式但不銷燬

Android按返回鍵退出程式但不銷燬

moveTaskToBack()方法:在activity中呼叫 moveTaskToBack (boolean nonRoot)方法即可將activity 退到後臺,注意不是finish()退出。

引數說明:

引數為false——代表只有當前activity是task根,指應用啟動的第一個activity時,才有效;

引數為true——則忽略這個限制,任何activity都可以有效。

說明:判斷Activity是否是task根,Activity本身給出了相關方法:isTaskRoot()

moveTaskToBack呼叫後,task中activity的順序不會發生變化,例如A啟動B,B中呼叫此方法退到後臺,重新啟動應用會呼叫B中的onRestart-onStart-onResume方法,不會重新呼叫onCreate,而且在B中按下back鍵返回的還是A,這就是退到後臺的功能。

另外在activity中按下back鍵,實際是呼叫了finish方法,應用退出。雖然應用已經退出,但程序沒有被殺死,android中一個應用運行於獨立的一個虛擬機器例項中,所以在重新啟動應用時一個類中的靜態物件還保持著執行時的狀態,注意在合適位置復位這些狀態。

關於moveTaskToBack 方法,官方API解釋如下:

public boolean moveTaskToBack (boolean nonRoot)
Since: API Level 1Move the task containing this activity to the back of the activity stack. The activity's order within the task is unchanged.

Parameters
nonRoot If false then this only works if the activity is the root of a task; if true it will work for any activity in a task.

Returns
If the task was moved (or it was already at the back) true is returned, else false.

貼上測試程式碼:

  1. <span style="font-size:14px;">import android.app.Activity;  
  2. import android.os.Bundle;  
  3. import android.util.Log;  
  4. import android.view.View;  
  5. import android.view.View.OnClickListener;  
  6. import android.widget.Button;  
  7. publicclass MainActivity extends Activity {  
  8.     private Button tv;  
  9.     @Override
  10.     publicvoid onCreate(Bundle savedInstanceState) {  
  11.         super.onCreate(savedInstanceState);  
  12.         setContentView(R.layout.activity_main);  
  13.         tv = (Button) findViewById(R.id.test);  
  14.         tv.setOnClickListener(new OnClickListener() {  
  15.             @Override
  16.             publicvoid onClick(View v) {  
  17.                 /** 
  18.                  * 會呼叫:onPause()和onStop() 
  19.                  */
  20.                 moveTaskToBack(true);  
  21.                 Log.e("====""點選運行了moveTaskToBack()方法");  
  22.             }  
  23.         });  
  24.     }  
  25.     @Override
  26.     protectedvoid onPause() {  
  27.         Log.e("====""onPause()");  
  28.         super.onPause();  
  29.     }  
  30.     @Override
  31.     protectedvoid onStop() {  
  32.         Log.e("====""onStop()");  
  33.         super.onStop();  
  34.     }  
  35.     @Override
  36.     protectedvoid onDestroy() {  
  37.         Log.e("====""onDestroy()");  
  38.         super.onDestroy();  
  39.     }  
  40.     @Override
  41.     protectedvoid onResume() {  
  42.         Log.e("====""onResume()");  
  43.         super.onResume();  
  44.     }  
  45.     @Override
  46.     protectedvoid onStart() {  
  47.         Log.e("====""onStart()");  
  48.         super.onStart();  
  49.     }  
  50.     @Override
  51.     protectedvoid onRestart() {  
  52.         Log.e("====""onRestart()");  
  53.         super.onRestart();  
  54.     }  
  55. }  
  56. </span>  


執行一下:

01-13 00:19:45.179: E/====(3801): 點選運行了moveTaskToBack()方法
01-13 00:19:45.199: E/====(3801): onPause()
01-13 00:19:45.662: E/====(3801): onStop()