標籤:des android style class blog code
Activity:
在Android的程式當中,Activity 一般代表手機螢幕的一屏。如果把手機比作一個瀏覽器,那麼Acitivity就相當於一個網頁。在Activity 當中可以添加一些Button、Check box 等控制項。可以監聽控制項並處理使用者的事件做出響應。
一般一個Android 應用是由多個Activity 組成的。這多個Activity 之間可以進行相互跳轉,例如,按下一個Button 按鈕後,可能會跳轉到其他的Activity。和網頁跳轉稍微有些不一樣的是,Activity 之間的跳轉有可能傳回值。當開啟一個新的螢幕時,之前一個螢幕會被置為暫停狀態,並且壓入曆史堆棧中。使用者可以通過後援動作返回到以前開啟過的螢幕。我們可以選擇性的移除一些沒有必要保留的螢幕,因為Android 會把每個應用的開始到當前的每一個螢幕儲存在堆棧中。Activity 是由Android 系統進行維護的,它也有自己的生命週期,即它的一個產生、運行、銷毀的一個周期,對於Activity,關鍵是其生命週期的把握,其次就是狀態的儲存和恢複(onSaveInstanceState onRestoreInstanceState),以及Activity 之間的跳轉和資料轉送(intent)。
Activity生命週期的幾個過程
1.啟動Activity:系統會先調用onCreate方法,然後調用onStart方法,最後調用onResume,Activity進入運行狀態。
2.當前Activity被其他Activity覆蓋其上或被鎖屏:系統會調用onPause方法,暫停當前Activity的執行。
3.當前Activity由被覆蓋狀態回到前台或解鎖屏:系統會調用onResume方法,再次進入運行狀態。
4.當前Activity轉到新的Activity介面或按Home鍵回到主屏,自身退居後台:系統會先調用onPause方法,然後調用onStop方法,進入停滯狀態。
5.使用者後退回到此Activity:系統會先調用onRestart方法,然後調用onStart方法,最後調用onResume方法,再次進入運行狀態。
6.當前Activity處於被覆蓋狀態或者後台不可見狀態,即第2步和第4步,系統記憶體不足,殺死當前Activity,而後使用者退回當前Activity:再次調用onCreate方法、onStart方法、onResume方法,進入運行狀態。
7.使用者退出當前Activity:系統先調用onPause方法,然後調用onStop方法,最後調用onDestory方法,結束當前Activity。
Android中如何建立一個Activity呢?
一、建立Activity類及相關的視圖檔案Layout(View),使用者自己建立的Activity類需要繼承自android.app.Activity類
二、配置AndroidManifest.xml檔案
三、重載onCreate,綁定Activity和Layout(View)
四、為View添加必要組件,可以在XML檔案中添加,也可以在程式中動態添加。
五、在onCreate()中實現初始商務邏輯,如為按鈕添加事件
每一個活動( Activity )都處於某一個狀態,對於開發人員來說,是無法控制其應用程式處於某一個狀態的,這些均由系統來完成。但是當一個活動的狀態發生改變的時候,開發人員可以通過調用 onXX() 的方法擷取到相關的通知資訊。在實現 Activity 類的時候,通過覆蓋( override )這些方法即可在你需要處理的時候來調用。
1、onCreate :當活動第一次啟動的時候,觸發該方法,可以在此時完成活動的初始化工作。
onCreate 方法有一個參數,該參數可以為空白( null ),也可以是之前調用 onSaveInstanceState ()方法儲存的狀態資訊。
2、onStart :該方法在建立或者從後台重新回到前台時被調用。
3、onResume :當一個活動和使用者發生互動的時候,觸發該方法。
4、 onPause :被覆蓋到下面或者鎖屏時被調用
5、onStop :當一個活動不再需要展示給使用者的時候,觸發該方法。如果記憶體緊張,系統會直接結束這個活動,而不會觸發 onStop 方法。 所以儲存狀態資訊是應該在onPause時做,而不是onStop時做。活動如果沒有在前台運行,都將被停止或者Linux管理進程為了給新的活動預留足夠的儲存空間而隨時結束這些活動。因此對於開發人員來說,在設計應用程式的時候,必須時刻牢記這一原則。在一些情況下,onPause方法或許是活動觸發的最後的方法,因此開發人員需要在這個時候儲存需要儲存的資訊。
6、onRestart :當處於停止狀態的活動從後台重新回到前台時被調用。
7、onDestroy :當活動銷毀的時候,觸發該方法。和 onStop 方法一樣,如果記憶體緊張,系統會直接結束這個活動而不會觸發該方法。
onSaveInstanceState :系統調用該方法,允許活動儲存之前的狀態,比如說在一串字串中的游標所處的位置等。通常情況下,開發人員不需要重寫覆蓋該方法,在預設的實現中,已經提供了自動儲存活動所涉及到的使用者介面組件的所有狀態資訊。
還會添加onWindowFocusChanged、onSaveInstanceState、onRestoreInstanceState方法:
1.onWindowFocusChanged:在Activity視窗獲得或失去焦點時被調用,例如建立時首次呈現在使用者面前;當前Activity被其他Activity覆蓋;當前Activity轉到其他Activity或按Home鍵回到主屏,自身退居後台;使用者退出當前Activity。以上幾種情況都會調用onWindowFocusChanged,並且當Activity被建立時是在onResume之後被調用,當Activity被覆蓋或者退居後台或者當前Activity退出時,它是在onPause之後被調用
2.onSaveInstanceState:(1)在Activity被覆蓋或退居後台之後,系統資源不足將其殺死,此方法會被調用;(2)在使用者改變螢幕方向時,此方法會被調用;(3)在當前Activity跳轉到其他Activity或者按Home鍵回到主屏,自身退居後台時,此方法會被調用。第一種情況我們無法保證什麼時候發生,系統根據資源緊張程度去調度;第二種是螢幕翻轉方向時,系統先銷毀當前的Activity,然後再重建一個新的,調用此方法時,我們可以儲存一些臨時資料;第三種情況系統調用此方法是為了儲存當前視窗各個View組件的狀態。onSaveInstanceState的調用順序是在onPause之前。
3.onRestoreInstanceState:(1)在Activity被覆蓋或退居後台之後,系統資源不足將其殺死,然後使用者又回到了此Activity,此方法會被調用;(2)在使用者改變螢幕方向時,重建的過程中,此方法會被調用。我們可以重寫此方法,以便可以恢複一些臨時資料。onRestoreInstanceState的調用順序是在onStart之後。
Activity棧
開發人員是無法控制Activity的狀態的,那Activity的狀態又是按照何種邏輯來運作的呢?
每個Activity的狀態是由它在Activity棧(是一個後進先出LIFO,包含所有正在運行Activity的隊列)中的位置決定的。
Activity四種不同載入模式
standard: 標準模式,一調用startActivity()方法就會產生一個新的執行個體。
singleTop: 檢查是否已經存在了一個執行個體位於Activity Stack的頂部,如果存在就不產生新的執行個體,反之則調用Activity的newInstance()方法產生一個新執行個體。
singleTask: 在一個新的Task中產生這個執行個體,以後每次調用都會使用此執行個體,而避免產生新的執行個體。
singleInstance: 這個基本上跟singleTask一樣,只是有一點不同,那就是在這個模式下的Activity執行個體所處的Task中,只能有這一個Activity執行個體,而不能有其他的執行個體。
這些啟動模式可以Android資訊清單檔AndroidManifest.xml中,通過<activity>中的launchMode屬性進行設定,如:
AndroidManifest.xml
<activity android:name="MainActivity"
android:launchMode="singleTop">
<intent-filter>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
Java Code
Intent intent = new Intent(SrcActivity.this, TargetActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
//參考intent.addFlags()的Flag)
startActivity(intent);
Service服務:
Service(服務)是一個沒有使用者介面的在後台運行執行耗時操作的應用組件。其他應用組件能夠啟動Service,並且當使用者切換到另外的應用情境,Service將持續在後台運行。另外,一個組件能夠綁定到一個service與之互動(IPC機制),例如,一個service可能會處理網路操作,播放音樂,操作檔案I/O或者與內容提供者(content provider)互動,所有這些活動都是在後台進行。
Service有兩種狀態,“啟動的”(Startd)和“綁定”(Bound)
通過startService()啟動的服務處於“啟動的”狀態,一旦啟動,service就在後台運行,即使啟動它的應用組件已經被銷毀了。通常started狀態的service執行單任務並且不返回任何結果給啟動者。比如當下載或上傳一個檔案,當這項操作完成時,service應該停止它本身。
還有一種“綁定”狀態的service,通過調用bindService()來啟動,一個綁定的service提供一個允許組件與service互動的介面,可以發送請求、擷取返回結果,還可以通過誇進程通訊來互動(IPC)。綁定的service只有當應用組件綁定後才能運行,多個組件可以綁定一個service,當調用unbind()方法時,這個service就會被銷毀了。
註:service與activity一樣都存在與當前進程的主線程中,所以,一些阻塞UI的操作,比如耗時操作不能放在service裡進行,比如另外開啟一個線程來處理諸如網路請求的耗時操作。如果在service裡進行一些耗CPU和耗時操作,可能會引發ANR警告,這時應用會彈出是強制關閉還是等待的對話方塊。所以,對service的理解就是和activity平級的,只不過是看不見的,在後台啟動並執行一個組件,這也是為什麼和activity同被說為Android的基本組件。
Service生命週期:
通過這個圖可以看到,兩種啟動service的方式以及他們的聲明周期,bind service的不同之處在於當綁定的組件銷毀後,對應的service也就被kill了。service的聲明周期相比與activity的簡單了許多,只要好好理解兩種啟動service方式的異同就行。
在Service每一次的開啟關閉過程中,只有onStart可被多次調用(通過多次startService調用),其他onCreate,onBind,onUnbind,onDestory在一個生命週期中只能被調用一次。
service,根據onStartCommand的傳回值不同,有兩個附加的模式:
START_STICKY 用於顯示啟動和停止service。
START_NOT_STICKY或START_REDELIVER_INTENT用於有命令需要處理時才啟動並執行模式。
服務不能自己運行,需要通過調用Context.startService()或Context.bindService()方法啟動服務。
使用startService()方法啟用服務,調用者與服務之間沒有關連,即使調用者退出了,服務仍然運行。
使用bindService()方法啟用服務,調用者與服務綁定在了一起,調用者一旦退出,服務也就終止.
1) startService啟動服務
private void startCustomService(){ Intent intent=new Intent(this,LocalService.class); startService(intent); }
2) 2) 用bindService方法啟動服務
LocalService localService=null;
private void BinderService(){
Intent intent=new Intent(this,LocalService.class);
bindService(intent, new ServiceConnection(){
@Override
public void onServiceConnected(ComponentName componentName, IBinder binder) {
//調用bindService方法啟動服務時候,如果服務需要與activity互動,
//則通過onBind方法返回IBinder並返回當前本地服務
localService=((LocalService.LocalBinder)binder).getService();
//這裡可以提示使用者,或者調用服務的某些方法
}
@Override
public void onServiceDisconnected(ComponentName componentName) {
localService=null;
//這裡可以提示使用者
}
}, Context.BIND_AUTO_CREATE);
}
Broadcast Receiver(廣播接收器)
Broadcast Receiver用於接收並處理廣播通知(broadcast announcements)。BroadcastReceive有1、系統廣播事件,比如:ACTION_BOOT_COMPLETED(系統啟動完成後觸發),ACTION_TIME_CHANGED(系統時間改變時觸發),ACTION_BATTERY_LOW(電量低時觸發)等等。2、使用者自訂的廣播事件。broadcast receiver可以通過多種方式通知使用者:啟動activity、使用NotificationManager、開啟背景燈、震動裝置、播放聲音等,最典型的是在狀態列顯示一個表徵圖,這樣使用者就可以點它開啟看通知內容。
通常我們的某個應用或系統本身在某些事件(電池電量不足、來電來簡訊)來臨時會廣播一個Intent出去,我們可以利用註冊一個Broadcast Receiver來監聽到這些Intent並擷取Intent中的資料。
接收broadcast需要註冊一個Broadcast Receiver,並且要註冊一個Intent Filter來制定Broadcase Receiver是對哪些Intent進行監聽。
我們自己的程式主動廣播Intent
final String BROADCAST = "com.forrest.action.mybroadcast";
Intent intent = new Intent(BROADCAST); // 對應setAction()
intent.putExtra("data_title", "來簡訊啦");
intent.putExtra("data_text", "美女你好,晚上可有空");
sendBroadcast(intent);
接收廣播
接收broadcast需要註冊一個Broadcast Receiver,並且要註冊一個Intent Filter來制定Broadcase Receiver是對哪些Intent進行監聽。
(1) 建立Broadcast Receiver
一個Broadcast receiver只有一個簡單的回呼函數:onReceive(Context curContext, Intent broadcastMsg),當一個廣播訊息被Receiver監聽到時,Android會調用它的onReceive()方法,並將包含訊息的Intent對象傳給它。onReceive中代碼的執行時間不要超過5s,否則android會彈出逾時dialog。 此時是否另開一個線程來處理耗時的操作呢?
Receiver只在onReceive方法執行時是啟用狀態,只要onReceive一返回,Receiver就不再是啟用狀態了。Receiver進程是被一個啟用狀態的broadcast receiver所保護而不被系統終止的,一旦onReceive返回,Receiver進程broadcast receiver所保護而變為一個空進程,空進程是可以在任意時刻被終止的。這就帶來了一個問題:當響應一個廣播資訊的處理十分耗時的時候,那麼就應該把這個處理放在一個單獨的線程裡去執行,來保證主線程裡的其他使用者互動組件能夠繼續運行,而一旦這麼做,當onReceive()喚起一個線程後就會馬上返回,這時就會把Receiver進程放到被終止的境地。解決這個問題的方案是在onReceive()裡開始一個Service,讓這個Service去做這件事情,那麼系統就會認為這個進程裡還有活動進行中。
(2) 註冊/登出Broadcast Receiver
1)在AndroidManifest.xml中註冊 ,為myReceiver註冊一個廣播位址
<receiver android:name=".myReceiver">
<intent-filter>
<!-- 和Intent中的action對應 -->
<action android:name="com.forrest.action.mybroadcast"/>
</intent-filter>
只要是com.forrest.action.mybroadcast這個地址的廣播都能收到
2) 在代碼中註冊
IntentFilter filter = new IntentFilter("com.forrest.action.mybroadcast");
// 和廣播中Intent的action對應
MyBroadcastReceiver br = new MyBroadcastReceiver();
registerReceiver(new MyBroadcastReceiver(), filter);
3)登出 unregisterReceiver(br);
http://blog.csdn.net/liuhe688/article/details/6955668,這篇文章有詳細介紹
ContentProvider(內容提供者)
用於對外共用資料,通過ContentProvider把應用中的資料共用給其他應用訪問,其他應用可以通過ContentProvider對指定應用中的資料進行操作。ContentProvider分為系統的和自訂的,系統的也就是。例如連絡人,圖片等資料。
android中對資料操作包含有:file, sqlite3, Preferences, ContectResolver與ContentProvider前三種資料操作方式都只是針對本應用內資料,程式不能通過這三種方法去操作別的應用內的資料
內容提供者繼承於ContentProvider 基類。一個應用實現ContentProvider來提供內容給別的應用來操作;一個應用通過ContentResolver來操作別的應用資料,
1、ContentProvider
Android提供了一些主要資料類型的ContentProvider,比如音頻、視頻、圖片和私人通訊錄等。可在android.provider包下面找到一些Android提供的ContentProvider。通過獲得這些ContentProvider可以查詢它們包含的資料,當然前提是已獲得適當的讀取許可權。
2、ContentResolver
當外部應用需要對ContentProvider中的資料進行添加、刪除、修改和查詢操作時,可以使用ContentResolver類來完成,要擷取ContentResolver對象,可以使用Context提供的getContentResolver()方法。
Intent:
Activity之間通過Intent進行通訊。在Intent 的描述結構中,有兩個最重要的部分:動作和動作對應的資料。
典型的動作類型有:MAIN(activity的門戶)、VIEW、PICK、EDIT 等。而動作對應的資料則以URI 的形式進行表示。例如:要查看一個人的連絡方式,你需要建立一個動作類型為VIEW 的intent,以及一個表示這個人的URI。
與之有關係的一個類叫IntentFilter。相對於intent 是一個有效做某事的請求,一個intentfilter 則用於描述一個activity(或者IntentReceiver)能夠操作哪些intent。一個activity 如果要顯示一個人的連絡方式時,需要聲明一個IntentFilter,這個IntentFilter 要知道怎麼去處理VIEW 動作和表示一個人的URI。IntentFilter 需要在AndroidManifest.xml 中定義。