Activity是一個應用程式組件,提供一個螢幕,使用者可以用來互動為了完成某項任務。
Activity中所有操作都與使用者密切相關,是一個負責與使用者互動的組件,可以通過setContentView(View)來顯示指定控制項。
在一個android應用中,一個Activity通常就是一個單獨的螢幕,它上面可以顯示一些控制項也可以監聽並處理使用者的事件做出響應。Activity之間通過Intent進行通訊。
Activity生命週期
安卓活動由一個返回棧管理
安卓活動有四個狀態
1.運行狀態
當一個活動位於棧頂的時候,這個活動就處於運行狀態,也就是和使用者進行互動的那個介面。
2.暫停狀態
當活動不處於棧頂,但依然可見。意思就是這個活動沒有被完全覆蓋,上面有一層對話方塊之類的。
3.停止狀態
活動不處於棧頂,完全不可見。這個好理解吧,就是使用者看不到了。
4.銷毀狀態
活動從棧中移除了,也就是被使用者關閉了。
Activity共有七個回調方法,覆蓋了活動整個生命週期
1.onCreate()
活動建立時調用,一般被用來初始化。
2.onStart()
由不可見重新可見的時候調用。
3.onResume()
當活動到達棧頂的時候調用,也就是活動準備和使用者互動的時候調用
4.onPause()
啟動或者恢複另一個活動的時候調用。
5.onStop()
當活動完全不可見的時候會執行,注意是完全不可見,若是是啟動一個對話方塊形式的活動,則不會啟動。
6.onDestroy()
當活動被銷毀之前調用
7.onRestart()
當活動由停止狀態變為運行狀態之前調用
下圖很直觀的表示了活動的生命週期
你可以用如下範例程式碼 仔細探索一下 通過logcat列印的內容 你能很容易的弄明白
public class MainActivity extends Activity { public static final String TAG="MainActivity"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.d(TAG,"onCreate"); Log.d(TAG,this.toString()); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_main); if(savedInstanceState!=null) { String temp=savedInstanceState.getString("data_key"); Log.d(TAG,temp); } Button startNormal=(Button)findViewById(R.id.start_normal_activity); Button startDialog=(Button)findViewById(R.id.start_dialog_activity); startNormal.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent=new Intent(MainActivity.this,NormalActivity.class); startActivity(intent); } }); startDialog.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent=new Intent(MainActivity.this,DialogActivity.class); startActivity(intent); } }); } @Override public void onStart(){ super.onStart(); Log.d(TAG,"onStart"); } @Override public void onResume(){ super.onResume(); Log.d(TAG,"onResume"); } @Override public void onPause(){ super.onPause(); Log.d(TAG,"onPause"); } @Override public void onStop(){ super.onStop(); Log.d(TAG,"onStop"); } @Override public void onDestroy(){ super.onDestroy(); Log.d(TAG,"onDestroy"); } @Override public void onRestart(){ super.onRestart(); Log.d(TAG,"onRestart"); }
關於啟動模式
activity的啟動也共有四種
要修改activity的啟動模式,需要在AndroidManifest.xml中修改activity標籤下的 android:launchMode
<activity android:name=".MainActivity" android:launchMode="singleTop" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter></activity>
1.standard
這是活動的預設啟動模式 ,這種啟動模式,每次啟動都會在棧中建立一個該活動的執行個體
好比在FirstActivity的基礎上再啟動一個FirstActivity 如果你要返回的話你就要按兩次返回鍵才能返回到案頭
2.singleTop
這種模式很好的解決了上一種模式的問題
如果FirstActivity這個活動已經在棧頂了 那麼如果你要再啟動FirstActivity 是不會再建立新的執行個體了的
但是這種方法僅限於FirstActivity在棧頂的情況,如果FirstActivity不在棧頂,也就是不在使用者能看到的介面,那麼還是會建立新的執行個體。
3.singleTask
singleTask完美解決建立重複活動執行個體的情況。每次啟動活動,它會自動尋找棧中是否存在該活動的執行個體,若存在直接使用,不存在才建立
4.singleInstance
這個比較特殊,它啟動活動時,會建立一個棧來存放新啟動的活動。這種模式可以解決不同應用程式之間調用活動的問題。