編輯:Android開發實例
Hi 大家好
今天我准備花一節課來講講Activity的生命周期,這個概念還是比較重要的,相信大家看書或者資料都會提及它,可想而知!希望大家能看了我的博客後能搞明白生命周期的概念以及在以後的代碼編寫中,代碼往哪裡去寫。
照例,上笑話。。。
有的女人就是Windows雖然很優秀,但是安全隱患太大。
有的女人就是MFC她條件很好,然而不是誰都能玩的起。
有的女人就是C#長的很漂亮,但是家務活不行。
有的女人就是C++,她會默默的為你做很多的事情。
有的女人就是匯編雖然很麻煩,但是有的時候還得求它。
有的女人就是SQL,她會為你的發展帶來莫大的幫助。 感慨下,呵呵
這是Android幫助文檔中的圖,我先發上。幫助文檔位置在例如我將SDK文件夾放在D盤,那麼我的幫助文檔路徑為
D:\Adnroid\android-sdk-windows\docs\index.html 英文好的朋友可以參考這個幫助文檔
我們主要會學習以下七個生命周期函數,活動(窗體)的生命周期函數並不止這七個,後面會說到。。耐心看
以下是對每個生命周期函數的中文解釋
大家看過這些解釋,對它有了一個大概的認識,那麼接下來我們動手開始編寫代碼,來看看運行時的效果,這是代碼
public class MainActivity extends Activity {
Button btn1;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
System.out.println("第一個活動(窗體)初始化------------- onCreate");
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btn1 =(Button) findViewById(R.id.btn1);
btn1.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setClass(MainActivity.this, ResultActivity.class);
startActivity(intent);
}
});
}
@Override
protected void onStart() {
// TODO Auto-generated method stub
super.onStart();
System.out.println("第一個活動(窗體)初始化完畢,並將要顯示時------------- onStart");
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
System.out.println("第一個活動(窗體)在即將於用戶交互時------------- onResume");
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
System.out.println("第一個活動(窗體)在系統即將啟動第二個活動時------------- onPause");
}
@Override
protected void onStop() {
// TODO Auto-generated method stub
super.onStop();
System.out.println("第一個活動(窗體)在用戶不可見時------------- onStop");
}
@Override
protected void onRestart() {
// TODO Auto-generated method stub
super.onRestart();
System.out.println("第一個活動(窗體)當重新啟動時------------- onRestart");
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
System.out.println("第一個活動(窗體)當活動銷毀時------------- onDestroy");
}
}
public class ResultActivity extends Activity {
TextView txtResult;
Button btn1;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
System.out.println("第二個活動(窗體)初始化------------- onCreate");
super.onCreate(savedInstanceState);
setContentView(R.layout.result);
txtResult = (TextView)findViewById(R.id.txtResult);
txtResult.setText("第二個窗體");
btn1 = (Button)findViewById(R.id.btn1);
btn1.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent();
i.setClass(ResultActivity.this, MainActivity.class);
startActivity(i);
}
});
}
@Override
protected void onStart() {
// TODO Auto-generated method stub
super.onStart();
System.out.println("第二個活動(窗體)初始化完畢,並將要顯示時------------- onStart");
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
System.out.println("第二個活動(窗體)在即將於用戶交互時------------- onResume");
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
System.out.println("第二個活動(窗體)在系統即將啟動第二個活動時------------- onPause");
}
@Override
protected void onStop() {
// TODO Auto-generated method stub
super.onStop();
System.out.println("第二個活動(窗體)在用戶不可見時------------- onStop");
}
@Override
protected void onRestart() {
// TODO Auto-generated method stub
super.onRestart();
System.out.println("第二個活動(窗體)當重新啟動時------------- onRestart");
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
System.out.println("第二個活動(窗體)當活動銷毀時------------- onDestroy");
}
}
如果大家要創建多個活動(窗體)時,需要到AndroidManifest.xml中進行活動(窗體)的注冊
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="TSD.Jason.Example"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="8" />
<application android:icon="@drawable/icon" android:label="@string/app_name" android:debuggable="true">
<activity android:name=".MainActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".ResultActivity"></activity>
</application>
</manifest>
在這裡說下,如何LogCat切換到Java透視圖中
在Java透視圖的左下角有一個小圖標,點擊後 -> 其它 -> Android -> LogCat -> 確定 此時LogCat就會出現在我們的包資源管理器那裡,你可以拖動它到你想要放置的地方。
由於我們在代碼中使用了System.out.println 那麼 我們可以在LogCat中去新建一個Filter 如何建立呢?
點擊那個綠色的加號,會彈出一個窗體 ,在Filter Name 中任意輸入一個名字 ,我這裡叫做Sys,在By Log Tag 中輸入 System.out 然後確定,此時就會創建成功,我們在程序中使用的System.out.println 就會顯示在剛才建立的那個選項卡中。
大家觀察,打印結果
到這裡,兩個窗體跳轉所要執行的函數,大家應該是能夠明白了。
當我們按下Home鍵,又該如何執行呢?
大家看圖,然後再參照最開始的那七個生命周期的說明,自己動手實踐下,就能明白了
當點擊Back鍵後,其實,Android操作系統是在向活動棧中逐一銷毀之前壓入的活動。大家可以這樣做個試驗,兩個窗體直接反復跳轉4次,在跳轉前,在編輯框中輸入一些值,然後在點擊Back鍵,看要點擊幾次,並看編輯框中的值。
Full Lifetime 全周期介於調用 onCreate 與 onDestroy 之間。在一些情況下,終止一個活動並不調用 onDestroy 。Activity通過調用 onCreate 來初始化用戶界面,數據,啟動服務以及線程。onCreate 方法有個Bundle對象參數,這個參數含有最後一次調用 onSaveIntanceState 保存的UI狀態數據。我們可以在 onCreate 中利用這個參數來恢復UI狀態數據,或者重寫 onRestoreInstanceState 。重寫 onDestroy 釋放資源,關閉數據庫等操作。 為了寫出比較高效的代碼,有個比較好的建議是避免創建短期對象。快速的創建和銷毀對象容易增加碎片回收線程的壓力,這樣會直接影響用戶體驗。
Visible Lifetime 可視期介於調用 onStart 與 onStop 之間。此時Activity是可見的,但是不能響應用戶事件。一個Activity在其生命周期中是有可能經歷多個可視期的。在非常極端的情況下,系統也有可能終止一個處於可視期的活動,這種情況很少見。onStop 方法通常用於暫時或者停止那些用來更新UI的動畫,線程,定時器,服務等,所以當活動不可見的時占用的系統資源是很少的。當活動由不可見狀態轉化為可見狀態時,在 onStart 中再啟動相關的線程和服務。onStart 和 onStop 同樣也用來注冊和取消注冊(unregister)那些用來更新UI的廣播接收者。在活動不可見時我們需要取消注冊接受者(Receivers),特別是那些支持目的動作(Intent)以及更新UI的接收者。
Activity Lifetime 當活動的 onResume 被調用,活動進入激活期;當 onPause 被調用時,激活期結束。一個活動被激活,它將處於前景屏幕,同時響應用戶的事件。同樣在活動的生命周期結束之前,存在多個激活期,一旦有新的活動被激活,當前活動將會失去焦點(暫停甚至停止……)。激活期是活動生命周期比較活躍的部分,會頻繁調用 onResume 和 onPause ,所以為了有良好的用戶體驗,在 onResume 和 onPause 方法中的代碼需要有更高的效率。 在調用 onPause 之前,活動會調用 onSaveInstanceState 來保存活動的UI狀態到 Bundle ,這個 Bundle 就是 onCreate 和 onRestoreInstanceState 這兩個方法的參數了。onSaveInstanceState 保存UI狀態(比如多選按鈕的狀態,界面焦點=),這樣當活動被重新激活時,能夠正確顯示被暫停前的UI。多數的活動都重寫 onPause 方法來提交未保存的數據,我們也可以在此選擇是否暫停線程,廣播接收者,這完全依軟件架構本身而定。在 onResume 中一般不執行太多的代碼,創建UI一般在 onCreate 或者 onRestoreInstanceState 中實現。 以上就是我對生命周期的理解以及整理,希望能幫到大家理解。 PPT和源碼下載Android中可以直接在位圖上進行人臉檢測。Android SDK為人臉檢測
篇幅較長遂分成上下兩篇,上一篇我們已經快要一氣呵成了,但是美中不足的是,這個界面並不能討得美工MM的歡心,美工MM曾寄希望於您,卻交出這麼作出這麼一副死型樣,我都
在RSS概述中簡單介紹了RSS,本節將為大家講解RSS文件的解析,而又因為RS
最近寫了一個簡單的朋友圈程序,包含了朋友圈的列表實現,視頻的錄制、預覽與上傳,圖片可選擇拍照或者從相冊選取,從相冊選取可以一次選擇多張照片,並且限制照片的張數,想擁有真正