Activity與Service生命週期
阿新 • • 發佈:2021-07-18
一. 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並不會完全停止,流程如下:
- Activity A 進入onPause();
- Activity B 依次 onCreate(), onStart(), onResume()。(此時Activity B得到了使用者焦點)
- 如果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具有兩種生命週期的可能(並非互斥的兩種)。
- start方式:onCreate(),onStartCommand()。onDestroy釋放資源。
- 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"); } }