1. 程式人生 > 其它 >Activity與Service生命週期

Activity與Service生命週期

一. Activity

先展示一張Activity的生命週期圖:

1.1 Activity狀態

只有下面三個狀態是靜態的,可以存在較長的時間內保持狀態不變。(其它狀態只是過渡狀態,系統快速執行並切換到下一個狀態)   

  • 執行(Resumed):
    • 當前activity在最上方,使用者可以與它進行互動。(通常也被理解為”running” 狀態)
    • 此狀態由onResume()進入,由onPause()退出
  • 暫停(Paused):
    • 當前activity仍然是可見的。但被另一個activity處在最上方,最上方的activity是半透明的,或者是部分覆蓋整個螢幕。被暫停的activity不會再接受使用者的輸入。
    • 處於活著的狀態(Activity物件存留在記憶體,保持著所有的狀態和成員資訊,仍然吸附在window manager)。
    • 當處於極度低記憶體的狀態時,系統會殺掉該activity,釋放相應資源。
    • 此狀態由onPause()進入,退出可能onResume()或者onCreate()重新喚醒,或者被onStop()結束
  • 停止(Stopped):
    • 當前activity完全被隱藏,不被使用者可見。可以認為是處於在後臺。
    • 處於活著的狀態(Activity物件存留在記憶體,保持著所有的狀態和成員資訊,不再吸附在window manager)。
    • 由於對使用者不再可見,只要有記憶體的需要,系統就會清理該activity用以釋放記憶體資源。
    • 該狀態由onStop()進入,或onRestart()或者onCreate()重新喚醒,或者被onDestroy()徹底死亡。
    • 其它狀態 (Created與Started)都是短暫的,系統快速的執行那些回撥函式並通過。

當acitivty處於暫停或者停止狀態,系統可以通過finish()android.os.Process.killProcess(android.os.Process.myPid())來殺死其程序。當該activity再次被開啟時(結束或殺死後),需要重新建立Ativity,走一遍完整的流程。

1.2 Activities呼叫流程

當Activity A 啟動 Activity B時,兩個activity都有自個的生命週期。Activity A暫停或者停止,Activity B被建立。記住,在Activity B建立之前,Activity A並不會完全停止,流程如下:

  1. Activity A 進入onPause();
  2. Activity B 依次 onCreate(), onStart(), onResume()。(此時Activity B得到了使用者焦點)
  3. 如果Activity A不再可見,則進入onStop().

1.3 程式碼實踐

利用下面的DemoActivity程式碼,可親自感受每一個階段的狀態。比如點返回鍵,home鍵,menu鍵等操作,可以藉助通過logcat檢視該activity到底處於哪種狀態,這裡就不說結果了,自己動手,豐衣足食。

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;

public class DemoActivity extends Activity {
    private static final String TAG = "demo";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.i(TAG,"onCreate::The activity is being created.");
    }
    @Override
    protected void onStart() {
        super.onStart();
        Log.i(TAG, "onStart::The activity is about to become visible.");
    }
    @Override
    protected void onResume() {
        super.onResume();
        Log.i(TAG, "onResume::The activity has become visible.");
    }
    @Override
    protected void onPause() {
        super.onPause();
        Log.i(TAG, "onPause:: Another activity is taking focus.");
    }
    @Override
    protected void onStop() {
        super.onStop();
        Log.i(TAG, "onStop::The activity is no longer visible");
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.i(TAG, "onDestroy::The activity is about to be destroyed");
    }
}

  

二. Service

先展示一張Service的生命週期圖:

2.1 啟動方式:

service有兩種啟動方式, 不同的啟動方式決定了Service具有兩種生命週期的可能(並非互斥的兩種)。

  1. start方式:onCreate(),onStartCommand()。onDestroy釋放資源。
  2. bind方式: onCreate(),onBind()方法。需要所有client全部呼叫unbindService()才能將Service釋放資源,等待系統回收。

2.2 程式碼實踐

利用下面的DemoService程式碼,通過logcat自行感受每一個階段的狀態與場景的關係。

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;

public class DemoService extends Service {
    private static final String TAG = "demo";

    int mStartMode;       // service被殺掉的方式
    IBinder mBinder;      // clients繫結介面
    boolean mAllowRebind; // 是否允許onRebind

    @Override
    public void onCreate() {
        Log.i(TAG,"onCreate::The service is being created");
    }
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.i(TAG,"onStartCommand::The service is starting");
        return mStartMode;
    }
    @Override
    public IBinder onBind(Intent intent) {
        Log.i(TAG,"onBind::A client is binding to the service");
        return mBinder;
    }
    @Override
    public boolean onUnbind(Intent intent) {
        Log.i(TAG,"onUnbind::All clients have unbound");
        return mAllowRebind;
    }
    @Override
    public void onRebind(Intent intent) {
        Log.i(TAG,"onRebind::A client rebind to the service " +
                "after onUnbind() has already been called");
    }
    @Override
    public void onDestroy() {
        Log.i(TAG,"onDestroy::The service is no longer used");
    }
}