中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android服務Service的用途是什么

發布時間:2021-11-04 13:42:43 來源:億速云 閱讀:817 作者:iii 欄目:開發技術

本篇內容介紹了“Android服務Service的用途是什么”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

前言:

Android的服務是開發Android應用程序的重要組成部分。不同于活動Activity,服務是在后臺運行,服務沒有接口,生命周期也與活動Activity非常不同。通過使用服務我們可以實現一些后臺操作,比如想從遠程服務器加載一個網頁等。服務能幫助我們在Android中實現多任務。

  我們已經知道,安卓的活動可以啟動,停止,當系統資源太低時可以銷毀,服務被設計為實現具有更長執行時間的任務。安卓的服務可以從活動Activity中啟動,也可以從一個廣播接收器和其他服務中啟動。

  必須注意,使用服務并不需要自動創建新的線程,所以如果在服務中我們實現一個簡單的邏輯,這不需要很長的時間去處理,我們其實不需要將它運行在單獨的線程。但是如果我們要實現復雜的邏輯,用很長一段時間去處理,我們就必須采取創建一個新線程去執行,否則在主線程上運行服務,可能會導致ANR問題。

1、服務用途

服務適合兩種用途:

  • 實現多任務

  • 激活 Inter-Process-Communication (IPC) 流程間通訊

第一種情況的典型的例子是: 需要從遠程服務器下載數據,在這種情況下,我們可以讓應用同時與用戶進行交互,并在后臺開始完成工作,而用戶可以繼續使用應用程序,當服務完成后發送一個消息給用戶。

在第二種情況下,我們可以通過服務“共享”一些常用的功能,使不同的應用程序可以重用這些功能。例如,假設我們有一個發送電子郵件的服務,我們希望在幾個應用程序共享此服務,這樣不必重寫相同的代碼。在這種情況下,我們可以使用IPC使服務公開,這個服務向“遠程”暴露接口,被其他應用程序調用。

下面是一個簡單的服務,繼承Service

2、繼承Service

public class TestService extends Service {

    @Override
    public IBinder onBind(Intent arg0) {       
        return null;
    }

}

服務是有生命周期的,可以實現其中一些回調方法:

public class TestService extends Service {

    @Override
    public void onCreate() {       
        super.onCreate();
    }

    @Override
    public void onDestroy() {       
        super.onDestroy();
    }


 
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {       
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public IBinder onBind(Intent arg0) {       
        return null;
    }

}

  只有服務被創建時,方法onCreate才會被唯一的調用一次。如果該服務已在運行這個方法將不會被調用。我們也不是直接調用它,操作系統OS調用這個方法。

  OnStartCommand是最重要的方法,因為它被調用的時候,我們需要啟動服務。在這個方法中,我們需要向我們運行的服務傳遞意圖,這樣我們就可以與服務交換一些信息。在這個方法中實現的邏輯可以直接在這個方法中被執行,如果執行很花費時間,我們就需要創建一個線程。正如你可以看到這個方法要求我們返回一個整數作為結果。此整數表示服務如何由操作系統來處理。

  • START_STICKY :使用這個返回值,如果OS殺死我們的服務,它會重新創建它,但是發往該服務的意圖Intent不會再被傳遞,這種方式下服務總是在運行。

  • START_NOT_STICKY: 如果OS殺死服務,就不會再創建,直到客戶端顯式激活onStart 命令

  •  START_REDELIVER_INTENT: 它類似 START_STICKY,意圖也會被再傳遞給該服務。

OnDestroy是在服務銷毀時由操作系統調用。

服務需要在Manifest.xml 中配置:

<service android:name=".TestService" android:enabled="true"/>

3、啟動和停止服務

  正如我們所知道服務必須首先被啟動,并在完成它的任務后最終停止。我們可以從活動Activity啟動它,我們可以使用Intent傳遞給服務一些信息。假設我們有兩個按鈕,一個開始和一個停止服務.

btnStart.setOnClickListener(new View.OnClickListener() {


 
    @Override
    public void onClick(View v) {
        Intent i = new Intent(MainActivity.this, TestService.class);
        i.putExtra("name", "SurvivingwithAndroid");       
        MainActivity.this.startService(i);       
    }
});


 
btnStop.setOnClickListener(new View.OnClickListener() {


 
    @Override
    public void onClick(View v) {
        Intent i = new Intent(MainActivity.this, TestService.class);
        MainActivity.this.stopService(i);
    }
});

運行效果如下:

Android服務Service的用途是什么

IntentService

  正如我們前面提到的服務運行在主線程,所以我們在本服務執行一些邏輯要非常小心。必須考慮到,如果這個邏輯是一個阻塞操作,或者需要較長的時間來完成,會導致一個ANR問題發生。在這種情況下,將邏輯轉移到一個單獨的線程,這意味著我們必須在onStartCommand方法創建線程并運行它。還有另一類稱為IntentService的衍生服務,可以簡化這些操作。當我們不需要同時處理多個請求,這個類是有用的。這個類創建一個工作線程來處理不同的請求,

功能如下:

  • 創建一個分離線程來處理請求

  • 創建一個請求隊列然后傳遞一個Intent消息

  • 創建onStartCommand的缺省實現

  • 當所有請求被處理后停止服務

public class TestIntentService extends IntentService {

    public TestIntentService() {
        super("TestIntentService");       
    }

    @Override
    protected void onHandleIntent(Intent intent) {

    }

}

onHandleIntent里面我們實現了邏輯,而無需關心這作業需要半天或更長,因為這種方法在一個單獨的線程中運行。

4、自動啟動服務

  如果我們想在智能手機開機時啟動它,我們先創建一個廣播接收器,監聽到這個事件,然后啟動該服務。

public class BootBroadcast extends BroadcastReceiver {

    @Override
    public void onReceive(Context ctx, Intent intent) {       
        ctx.startService(new Intent(ctx, TestService.class));

    }

}

 Manifest.xml中配置:

<receiver android:name=".BootBroadcast">   
    <intent-filter >
        <action android:name="android.intent.action.BOOT_COMPLETED"/>               
    </intent-filter>
</receiver>

“Android服務Service的用途是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

乐至县| 嘉祥县| 太原市| 乡宁县| 鄂托克前旗| 福泉市| 芜湖县| 雷州市| 洛浦县| 什邡市| 阿巴嘎旗| 华容县| 靖远县| 北宁市| 株洲县| 绵竹市| 澎湖县| 通化县| 绥芬河市| 星子县| 沅陵县| 莱州市| 云梦县| 聊城市| 上蔡县| 多伦县| 滦平县| 外汇| 甘泉县| 花垣县| 漠河县| 孙吴县| 平利县| 西峡县| 晋城| 沙坪坝区| 广汉市| 布尔津县| 始兴县| 原阳县| 辰溪县|