亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Android四大組件之Service服務(wù)詳細講解

 更新時間:2022年07月20日 15:16:36   作者:半身風(fēng)雪  
Android的服務(wù)是開發(fā)Android應(yīng)用程序的重要組成部分。不同于活動Activity,服務(wù)是在后臺運行,服務(wù)沒有接口,生命周期也與活動Activity非常不同。通過使用服務(wù)我們可以實現(xiàn)一些后臺操作,比如想從遠程服務(wù)器加載一個網(wǎng)頁等,下面來看看詳細內(nèi)容,需要的朋友可以參考下

上一節(jié):Activity

簡介:在Android組件中最基本也是最為常見的四大組件:

  • Activity
  • Service服務(wù)
  • Content Provider內(nèi)容提供者
  • BroadcastReceiver廣播接收器

一、Service是什么

Service是Android系統(tǒng)中的四大組件之一,它是一種長生命周期的,沒有可視化界面,運行于后臺的一種服務(wù)程序。

Service 有的啟動方式有兩種:

  • startService啟動
  • bindService啟動

二、Service 的啟動方式

2.1、startService 顯示啟動

Service啟動

首先我們創(chuàng)建一個MyService 類,并且繼承自Service

public class MyService extends Service {
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
}

這里需要先實現(xiàn)onBind方法,onBind() 是Service必須實現(xiàn)的方法,返回的IBinder對象相當(dāng)于Service組件的代理對象,Service允許其他程序組件通過IBinder對象來訪問Service內(nèi)部數(shù)據(jù),這樣即可實現(xiàn)其他程序組件與Service之間的通信。

AndroidManifest.xml 清單文件中注冊

<!--        組件必須要在清單文件里面注冊-->
<service android:name=".MyService" />

顯式啟動通過類名稱來啟動,需要在Intent中指明Service所在的類,并調(diào)用startService (lntent)啟動service。這里我使用按鈕測試,需要在activity 中添加一個 serviceStart 按鈕,用來演示

public void onClick(View view) {
    startService(new Intent(this, MyService.class));
}

回到MyService 類,并且添加一個onCreate 生命周期,用于驗證我們的啟動

@Override
public void onCreate() {
    super.onCreate();
    System.out.println("MyService.onCreate service 啟動成功");
}

運行結(jié)果

通過該方式啟動Service,訪問者與Service之間沒有關(guān)聯(lián),即使訪問者退出了,Service也仍然運行。

按上面的說法,即使訪問者退出了,Service也仍然運行,那么我們該怎么結(jié)束呢?

Service 停止

我們在Activity 中,再添加一個停止按鈕。

顯式啟動停止Service,需要將啟動Service的Intent傳遞給stopService (Intent)函數(shù)。

public void onClickStop(View view) {
    stopService(new Intent(this, MyService.class));
}

回到MyService 類,并且添加一個onDestroy 生命周期,用于驗證我們的停止

@Override
public void onDestroy() {
    super.onDestroy();
    System.out.println("MyService.onDestroy service 停止");
}

運行結(jié)果

上面我說startService 是顯示啟動,那么是不是還有對應(yīng)的隱式啟動呢?確實是有,但是從Android5.0開始,Google要求必須使用顯示Intent啟動Service,所以隱式啟動咱就不介紹了。

2.2、bindService 綁定啟動

使用bindService()方法啟動Service

我們在回到Activity 中,再添加兩個按鈕,onClickBindServiceStart 和 onClickUnBindService 按鈕

public void onClickBindServiceStart(View view) {
    bindService(new Intent(this, MyService.class), connection, Context.BIND_AUTO_CREATE);
}

參數(shù)說明:

  • service:該參數(shù)通過Intent指定需要啟動的service。
  • connection:該參數(shù)是ServiceConnnection對象,當(dāng)綁定成功后,系統(tǒng)將調(diào)用serviceConnnection的onServiceConnected ()方法,當(dāng)綁定意外斷開后,系統(tǒng)將調(diào)用ServiceConnnection中的onServiceDisconnected方法。
  • flags:該參數(shù)指定綁定時是否自動創(chuàng)建Service。如果指定為BIND_AUTO_CREATE,則自動創(chuàng)建,指定為0,則不自動創(chuàng)建。

初始化一個connection

private ServiceConnection connection = new ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
    }
    @Override
    public void onServiceDisconnected(ComponentName componentName) {
    }
};

綁定啟動中,當(dāng)調(diào)用者通過bindService()函數(shù)綁定Service時,onCreate()函數(shù)和onBinde ( )函數(shù)將被先后調(diào)用。

運行結(jié)果

通過該方式啟動Service,訪問者與Service綁定在一起,訪問者一旦退出了,Service也就終止了。

unbindService 停止服務(wù)

取消綁定僅需要使用unbindService()方法,并將ServiceConnnection傳遞給unbindService()方法

在停止服務(wù)點擊事件中使用 unbindService() 方法

public void onClickUnBindService(View view) {
    unbindService(connection);
}

回到MyService 類,添加onUnbind 生命周期方法

@Override
public boolean onUnbind(Intent intent) {
    System.out.println("MyService.onUnbind");
    return super.onUnbind(intent);
}

當(dāng)調(diào)用者通過unbindService()函數(shù)取消綁定Service時,onUnbind()函數(shù)將被調(diào)用。如果onUnbind()函數(shù)返回true,則表示重新綁定服務(wù)時,onRebind ()函數(shù)將被調(diào)用。

運行結(jié)果

需要注意的是,unbindService()方法成功后,系統(tǒng)并不會調(diào)用onServiceConnected(),因為onServiceConnected()只會在意外斷開綁定時才被調(diào)用。

這里別忘了在onDestroy() 銷毀bindService

@Override
protected void onDestroy() {
    super.onDestroy();
    unbindService(connection);
}

三、Service 生命周期

startService啟動的生命周期

onCreate() 當(dāng)Service第一次被創(chuàng)建時,由系統(tǒng)調(diào)用。

onStartCommand() 當(dāng)startService方法啟動Service時,該方法被調(diào)用。

onDestroy() 當(dāng)Service不再使用時,由系統(tǒng)調(diào)用。

注意:一個startService只會創(chuàng)建一次,銷毀一次,但可以開始多次,因此,onCreate()和onDestroy()方法只會被調(diào)用一次,而onStart()方法會被調(diào)用多次。

bindService啟動的生命周期

onCreate() 當(dāng)Service被創(chuàng)建時,由系統(tǒng)調(diào)用。

onBind() 當(dāng)bindService方法啟動Service時,該方法被調(diào)用。

onUnbind() 當(dāng)unbindService方法解除綁定時,該方法被調(diào)用。

onDestroy() 當(dāng)Service不再使用時,由系統(tǒng)調(diào)用。

注意:一個bindService可以創(chuàng)建多次,銷毀多次,重復(fù)使用。

到此這篇關(guān)于Android四大組件之Service服務(wù)詳細講解的文章就介紹到這了,更多相關(guān)Android Service服務(wù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Android中判斷屏幕是否亮屏和是否解鎖功能

    Android中判斷屏幕是否亮屏和是否解鎖功能

    這篇文章主要介紹了Android中判斷屏幕是否亮屏和是否解鎖功能,需要的朋友可以參考下
    2017-02-02
  • Android在多種設(shè)計下實現(xiàn)懶加載機制的方法

    Android在多種設(shè)計下實現(xiàn)懶加載機制的方法

    這篇文章主要介紹了Android在多種設(shè)計下實現(xiàn)懶加載機制的方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • TabLayout實現(xiàn)ViewPager指示器的方法

    TabLayout實現(xiàn)ViewPager指示器的方法

    這篇文章主要為大家詳細介紹了TabLayout實現(xiàn)ViewPager指示器,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • Android自定義View中Paint、Rect、Canvas介紹(一)

    Android自定義View中Paint、Rect、Canvas介紹(一)

    這篇文章主要為大家詳細介紹了Android自定義View中Paint、Rect、Canvas的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • Android Metro菜單實現(xiàn)思路及代碼

    Android Metro菜單實現(xiàn)思路及代碼

    在安卓平臺上實現(xiàn)一下Metro菜單效果,之前有介紹過了,相信大家對此不會陌生了吧,感興趣的朋友可以了解下哈
    2013-06-06
  • Android輔助權(quán)限的介紹和配置完整記錄

    Android輔助權(quán)限的介紹和配置完整記錄

    這篇文章主要給大家介紹了關(guān)于Android輔助權(quán)限的介紹和配置的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-01-01
  • Android開機畫面的具體修改方法

    Android開機畫面的具體修改方法

    Android開機畫面的具體修改方法,需要的朋友可以參考一下
    2013-06-06
  • android文件操作——讀取assets和raw文件下的內(nèi)容

    android文件操作——讀取assets和raw文件下的內(nèi)容

    本篇文章主要介紹了android文件操作——讀取assets和raw文件下的內(nèi)容,并附簡單實例代碼,需要的朋友可以參考下。
    2016-10-10
  • Android獲得內(nèi)/外置存儲卡路徑的方法

    Android獲得內(nèi)/外置存儲卡路徑的方法

    我們知道Android上一般都有外置的存儲卡,內(nèi)置存儲卡路徑大家都知道怎么獲得的。那么如何獲取外置存儲卡的位置呢?下面小編通過本文給大家分享下
    2017-01-01
  • Kotlin 編程三分鐘入門

    Kotlin 編程三分鐘入門

    一個多月以來Kotlin從入門到現(xiàn)在,堅持用來開發(fā)的切身感受。因為語法與Java的區(qū)別挺大的一開始很想放棄,如果不是因為項目在使用,想必很少人會嘗試這樣一門小眾語言,但是習(xí)慣后會發(fā)現(xiàn)這些年究竟浪費多少時間在寫無用的Java代碼了
    2017-05-05

最新評論