Android四大組件android
- Activity
- Activity之間經過Intent進行通訊。
- android應用中每個Activity都必需要在AndroidManifest.xml配置文件中聲明,不然系統將不識別也不執行該Activity。
- 四種啓動模式 standard(默認) singleTop singleTask singleInstance
standard模式下,每當啓動一個新的Activity,它就會進入任務棧,並處於棧頂的位置,對於使用standard模式的Activity,系統不會判斷該Activity在棧中是否存在,每次啓動都會建立一個新的實例app
singleTop模式與standard相似,不一樣的是,當啓動的Activity已經位於棧頂時,則直接使用它不建立新的實例。若是啓動的Activity沒有位於棧頂時,則建立一個新的實例位於棧頂ide
singleTask模式,每次啓動該Activity時,系統首先會檢查棧中是否存在該Activity的實例,若是發現已經存在則直接使用該實例,並將當前Activity之上的全部Activity出棧,若是沒有發現則建立一個新的實例。oop
singleInstance模式加載Activity時,不管從哪一個任務棧中啓動該Activity,只會建立一個Activity實例,而且會使用一個全新的任務棧來裝載該Activity實例。採用這種模式啓動Activity會費爲一下兩種狀況:post
第一種:若是要啓動的Activity不存在,系統會建立一個新的任務棧,在建立該Activity的實例,並把該Activity加入棧頂this
第二種::若是要啓動的Activity已經存在,不管位於哪一個應用程序或者哪一個任務棧中,系統都會把該Activity所在的任務棧轉到前臺,從而使該Activity顯示出來。spa
4.activity的生命週期 onCreate onStart onResume onPause onStop onDestroy線程
- Service
1.啓動的兩種方式:code
startService(啓動):當應用程序組件(如activity)調用startService()方法啓動服務時,服務處於started狀態。xml
bindService(綁定):當應用程序組件調用bindService()方法綁定到服務時,服務處於bound狀態。
區別:started service(啓動服務)是由其餘組件調用startService()方法啓動的,這致使服務的onStartCommand() 方法 (該方法每次startSevice啓動都會調用一次)被調用。當服務是started狀態時,其生命週期與啓動它的組件無關,而且能夠在後臺無限期運行,即便啓動服務的組件已經被銷燬。所以,服務須要在完成任務後調用stopSelf()方法中止,或者由其餘組件調用stopService()方法中止。
(b)使用bindService()方法啓用服務,調用者與服務綁定在了一塊兒,調用者一旦退出,服務也就終止,大有「不求同時生,必須同時死」的特色。
開發人員須要在應用程序配置文件中聲明所有的service,使用<service></service>標籤
- Content Provider
其餘應用能夠經過ContentResolver類從該內容提供者中獲取或存入數據; Content Provider的啓動方式也是當ContentResolver對象在請求時纔會啓動。
開發人員不會直接使用ContentProvider類的對象,大多數是經過ContentResolver對象實現對ContentProvider的操做。
- Broadcast Receiver
廣播接收者的註冊有兩種方法,分別是程序動態註冊和AndroidManifest文件中進行靜態註冊
動態註冊廣播接收器特色是當用來註冊的Activity關掉後,廣播也就失效了。靜態註冊無需擔心廣播接收器是否被關閉,只要設備是開啓狀態,廣播接收器也是打開着的。也就是說哪怕app自己未啓動,該app訂閱的廣播在觸發時也會對它起做用。
內容提供者僅在響應ContentResolver提出請求的時候激活。而一個廣播接收器僅在響應廣播信息的時候激活。因此,沒有必要去顯式的關閉這些組件。Activity關閉:能夠經過調用它的finish()方法來關閉一個activity。服務關閉:對於經過startService()方法啓動的服務要調用Context.stopService()方法關閉服務,使用bindService()方法啓動的服務要調用Contex.unbindService()方法關閉服務。
Handler機制
Looper Message MessageQueue
在子線程中new 一個 Handler須要注意的地方: 子線程中必需要持有Looper對象,否則沒法建立
更便捷的方式是使用HandlerThread
thread= new Thread(){ @Override public void run() { super.run(); Looper.prepare(); handler=new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); Log.i(TAG, "handleMessage: "+msg.toString()); } @Override public void dispatchMessage(Message msg) { super.dispatchMessage(msg); Log.i(TAG, "dispatchMessage: "+msg.toString()); } }; Looper.loop(); } }; thread.start(); //Looper. }
HandlerThread的源碼:
@Override public void run() { mTid = Process.myTid(); Looper.prepare(); synchronized (this) { mLooper = Looper.myLooper(); notifyAll(); } Process.setThreadPriority(mPriority); onLooperPrepared(); Looper.loop(); mTid = -1; }
子線程中如何更新UI
1 Activity.runOnUiThread(Runnable)
2 View.post(Runnable)
3 View.postDelayed(Runnable,long)
4 Handler
5 AsyncTask