Android Service學(xué)習(xí)(三)

針對(duì)Android四大組件之一的service做了一些細(xì)節(jié)的說明,本篇主要針對(duì)Android Service學(xué)習(xí)(一)作一些補(bǔ)充。


補(bǔ)充1

android的后臺(tái)指的是運(yùn)行是不依賴于UI界面的,即使activity被銷毀或者APP被關(guān)閉,只要進(jìn)程還在,service就可以繼續(xù)運(yùn)行,這一點(diǎn)依賴于service的線程是運(yùn)行在APP的進(jìn)程中的主UI線程。

Thread:用于開啟一個(gè)子線程去執(zhí)行一些比較耗時(shí)的操作,如下載等。之所以選擇在service中新建一個(gè)線程而不是在activity中建立,是因?yàn)閍ctivity很難對(duì)thread進(jìn)行控制,當(dāng)activity被銷毀,就沒有辦法重新獲得之前創(chuàng)建的線程的實(shí)例,此外,在一個(gè)A activity創(chuàng)建的子線程,在另一個(gè)B activity是無法對(duì)A創(chuàng)建的子線程進(jìn)行操作的。而所有的activity都可以與service進(jìn)行綁定,然后就可以操作其中的方法,即使activity被銷毀,之后只要重新與service進(jìn)行綁定,就可以重新獲取service中的Binder實(shí)例,不需要擔(dān)心無法對(duì)后臺(tái)控制的問題,activity也就可以放心的finish();

常用的service可以被寫成:

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    Log.e(TAG,"onStartCommand excused");
    new Thread(new Runnable() {
        @Override
        public void run() {
            //開始執(zhí)行后臺(tái)任務(wù)
        }
    }).start();
    return super.onStartCommand(intent, flags, startId);
}

//具體的Binder實(shí)例
public class MyBinder extends Binder {
    public void startDownLoad(){
        Log.e(TAG,"開始下載");
        new Thread(new Runnable() {
            @Override
            public void run() {
                //執(zhí)行具體的耗時(shí)的下載任務(wù)
            }
        }).start();
    }
}

補(bǔ)充2

針對(duì)service的開啟和停止,通過以下log來具體的展示:

1. 開啟

使用startService(intent)開啟服務(wù),調(diào)用log如下:

com.example.slide_table E/MyService:on Create excused
com.example.slide_table E/MyService:onStartCommand excused
com.example.slide_table E/MyService:onDestroy excused

使用bindService(intent)綁定服務(wù),調(diào)用log如下:

com.example.slide_table E/MyService: on Create excused
com.example.slide_table E/MyService: 開始下載
com.example.slide_table E/MyService: onDestroy excused

如上log的結(jié)果,在調(diào)用bind綁定服務(wù)的時(shí)候并不會(huì)執(zhí)行onStartCommand()函數(shù)。

2. 停止

使用startService(intent)開啟服務(wù),然后接著點(diǎn)擊bindService(intent),單獨(dú)的點(diǎn)擊stopService(intent)或者unbind(connection)都不會(huì)停止service,只有在點(diǎn)擊stopService(intent)后緊接著點(diǎn)擊unbind(connection),或者點(diǎn)擊unbind(connection)緊接著點(diǎn)擊stopService(intent)才會(huì)銷毀該service。

即:點(diǎn)擊stop按鈕只會(huì)讓service停止,點(diǎn)擊unbind按鈕只會(huì)讓service和activity解除綁定,一個(gè)service只有在既沒有和任何activity綁定的時(shí)候且又處于停止?fàn)顟B(tài)的時(shí)候才會(huì)被銷毀。

具體的log如下:

com.example.slide_table E/MyService: on Create excused//使用start開啟
com.example.slide_table E/MyService: onStartCommand excused
com.example.slide_table E/MyService: 開始下載//點(diǎn)擊bind按鈕
com.example.slide_table E/MyService: 停止線程//點(diǎn)擊stop按鈕
com.example.slide_table E/MyService: onDestroy excused//點(diǎn)擊unbind按鈕
com.example.slide_table E/MyService: on Create excused
com.example.slide_table E/MyService: onStartCommand excused
com.example.slide_table E/MyService: 開始下載
com.example.slide_table E/MyService: 解除綁定//點(diǎn)擊unbind按鈕
com.example.slide_table E/MyService: 停止線程//點(diǎn)擊stop按鈕
com.example.slide_table E/MyService: onDestroy excused

Android service的分享學(xué)習(xí)暫且告一段落,后續(xù)還會(huì)根據(jù)項(xiàng)目中實(shí)際遇到的service的應(yīng)用作說明,分析。如即將撰寫的關(guān)于Android藍(lán)牙開發(fā)中遇到的service的應(yīng)用。

以上博客中關(guān)于分享的知識(shí)點(diǎn)或者遇到的問題,以及不正確的地方還請(qǐng)幫忙指出,謝謝。。。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,039評(píng)論 25 709
  • 原文地址:Android Service完全解析,關(guān)于服務(wù)你所需知道的一切(上) 相信大多數(shù)朋友對(duì)Service這...
    AiPuff閱讀 4,304評(píng)論 11 98
  • Service的生命周期 service的生命周期,從它被創(chuàng)建開始,到它被銷毀為止,可以有兩條不同的路徑: A s...
    _執(zhí)_念__閱讀 1,637評(píng)論 0 19
  • 老虎回到洞里,一只大灰狼到洞里通風(fēng)報(bào)信,說:“大王,您上當(dāng)了。那些小動(dòng)物哪里是怕狐貍呀,明明怕你呀!”老虎一聽,大...
    吳珮嘉閱讀 350評(píng)論 0 0
  • 莎倫今天才看了一小會(huì)兒書,卻看了整整一下午的電視。 今天是莎倫小姐弟弟的生日,在家昏天黑日的日子,差點(diǎn)忘掉這檔...
    莎倫小姐閱讀 216評(píng)論 0 1

友情鏈接更多精彩內(nèi)容