編輯:關於Android編程
Service 服務:
四大組件之一
特性: 沒有界面運行在後台,除了界面相關的之外,Activity能做的Service也能做。
service的生命周期:
上圖所述一共有兩種服務,一種是直接通過意圖打開的服務 與打開的應用無關,第二種為跟應用綁定在一塊的服務。程序死了 服務也就跟著死了。
聲明要素
1. 聲明一個類繼承Service
2.在清單文件中聲明
開啟服務:
涉及的生命周期:
onCreate ---- > onStartCommand()
注意:
1. 第一次開啟服務的時候會調用onCreate()onStartCommand().
如果服務已經開啟再次調用startService(),不會開啟新的服務對象,只會調用已經開啟的服務的onStartCommand()方法。
2. startService()方法開啟的服務,在界面關閉之後服務依然存在,下次開啟一個新的界面調用startService(),依然不會打開新的服務,只會調用當前服務的onStartCommand()。
3. 通過startService()開啟的服務,只能通過stopService()關閉。
注意: startService()跟stopService()不一定要在同一個界面中調用。
關閉服務:
生命周期:
onDestroy()
2.3 把Activity中的數據傳遞給Service
Activity:
Service:
2.4 Service傳遞消息給Activity
場景描述:
a.在Activity中除界面相關的部分,其他代碼代碼功能也能在Service執行。
b.Activity一旦被關閉,對象就銷毀,對象一旦銷毀保存的數據也就消失,下次再打開就一個新對象。
c.Activity關閉但是Service還在,Service不會受到Activity關閉的影響。
需求:
當Activity關閉的時候把Activity上的信息保存到Service中,因為Service不會關閉,然後下次打開新的Activity從Service上把信息讀取回來,顯示在Activity上,讓用戶認為界面還是一樣。
問題:
startService()開啟的服務可以運行在後台,並且可以接收Activity傳遞的消息,但是無法獲取Service中保存的信息。
解決: 綁定服務
生命周期:
onCreate() onBinde()
注意:
1. 綁定成之後再次綁定沒有效果
2.綁定成功之後Service的生命周期就跟Activity綁定在一起了,
一旦Activity關閉Service也隨之銷毀。
3.Activity關閉之前如果沒有解除綁定的話,會造成綁定洩漏,所以一般在Activity關閉之前會解除綁定
2.4.2 解除綁定
生命周期:
onUnBind() onDestroy()
注意:1.通過bindService()開啟並綁定的服務,一旦調用unBindService()解除綁定,Service就銷毀掉。
2. 如果已經解除綁定再次解除綁定就會異常
2.4.3 Activity跟Service之間的消息傳遞:
Activity ----> Service:
Activity:
Service:
在onBind()中接收
Service -----> Activity
步驟:
1. MyService這個類中有一個成員變量:String msg
我們希望在Activity上可以顯示這個數據
所以的把MyService上的數據傳遞到Activity上
2. 在綁定的時候,如果綁定成的化,調用Service中onBind()要求傳遞一個IBinder類型對象的引用,給Activity中ServiceConnection中的onServiceConnection()方法。
3.IBinder是一個接口,所以我們可以在MyService中聲明一個內部類MyBinder 繼承Binder(Binder實現IBinder接口),因為MyBinder是MyService的內部類所以可以調用MyService的成員變量,又因為MyService是我們自己聲明所以我們新增方法以及成員變量,通過新增方法去調用MyService的成員變量。
onBind()要返回一個IBinder類型的對象的引用我們就給他一個MyBinder對象的引用。
4.綁定成功之後,onBind()返回的IBinder類型對象的引用會在調用ServiceConnection類型的對象的onServiceConnected方法傳入,因為我們ServiceConnection聲明成Activity的內部類所以可以在這個方法中調用MyBinder對象的方法獲取對應的數據,並顯示在Activity上
問題:
通過綁定可以獲取Service上保存的信息,但是綁定Service的話Activity關閉Service也隨之關閉,信息也就銷毀。
我們想要實現是消息可以保存在Service中,並且也能從Service中獲取消息。
解決:
分析:
a.bindService()幫服務可以獲取服務信息,但是Activity關閉Service也關閉
b.startService()雖然無法返回信息,但是activity關閉service依然存在,必須通過stopService關閉。
先通過startService()開始服務,然後再去bindService()綁定服務。
好處: 先startService()開啟服務,只要沒有stopService()服務就一直在,這樣就可以用於保存信息。
再通過bindService()去綁定已經開啟的服務也可以獲取信息,當界面關閉的時候只會解除綁定不會銷毀Service,下次再開啟界面可以通過綁定再獲取信息。
------------------------------基本的服務就介紹完整了-------------------------
有時候要這兩種服務配合使用。 接下來的實例是 模仿一個音樂播放器進行
1.
.在Activity開啟的時候獲取播放器對象並操作
一般在onStart() 中
先startService(),在bindService()
一般在onStop()中解除綁定
界面關閉之前解除綁定不會綁定洩漏
2.
在每次打開界面綁定的時候去獲取Service中保存的MediaPlayer對象的引用給Activity
在Myservice中聲明一個內部類新增一個方法用於返回Service中成員變量MediaPlayer的引用
本文采用一個Demo來展示Android中ExpandableListView控件的使用,如如何在組/子ListView中綁定數據源。直接上代碼如下:程序結構圖:layo
1. 從相冊選擇照片進行裁剪 從相冊選擇照片並裁剪: /** * 從相冊選擇照片進行裁剪 */ private void
平時的一些Android學習視頻中,他們都是基於Android2.2的去使用ListView,我看到都是會在UI線程中去訪問網絡獲取數據,但是這在Android4.0之後
本文均屬自己閱讀源碼的點滴總結,轉賬請注明出處謝謝。 歡迎和大家交流。qq:1037701636 email:[email protected] Androi