Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android的四大組建Service 簡單、易懂的解析

Android的四大組建Service 簡單、易懂的解析

編輯:關於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的引用

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved