Android學(xué)習(xí)筆記之Service

1.Service 是什么峻凫?

Service 是 Android 中實(shí)現(xiàn)程序后臺(tái)運(yùn)行的解決方案炊汹,非常適用于去執(zhí)行那些不需要和用戶交互而且還要求長(zhǎng)期運(yùn)行的任務(wù)篡撵。Service默認(rèn)運(yùn)行在UI主線程中褐着,所以不能做耗時(shí)操作弓千,只能在Service中創(chuàng)建子線程來(lái)完成耗時(shí)操作。


補(bǔ)充說(shuō)明:Service有兩種啟動(dòng)方式献起,startService()bindService(),它們之間的區(qū)別是:

  • startService()啟動(dòng)后無(wú)返回結(jié)果镣陕,startService()的生命周期有三個(gè)函數(shù)谴餐,分別是onCreate()onStartCommand()onDestory()呆抑。當(dāng)我們首次startSerivce()啟動(dòng)一個(gè)service的時(shí)候岂嗓,會(huì)調(diào)用service的onCreate函數(shù)創(chuàng)建該服務(wù),然后調(diào)用onStartCommand函數(shù)執(zhí)行操作鹊碍,可以調(diào)用stopSevice/stopSelf來(lái)結(jié)束一個(gè)Service(多次調(diào)用都不會(huì)有異常)厌殉。(注:多次通過(guò)startService啟動(dòng)服務(wù),onCreate只執(zhí)行1次侈咕,都會(huì)調(diào)用onStartCommand公罕。)啟動(dòng)后,它就獨(dú)立于調(diào)用者而運(yùn)行耀销,因此任務(wù)結(jié)束后楼眷,Service需要stopSevice/stopSelf函數(shù)來(lái)停止該服務(wù),避免消耗系統(tǒng)資源或電量熊尉。
  • bindService()綁定Service后可以進(jìn)行交互操作(發(fā)請(qǐng)求罐柳、獲取結(jié)果或IPC通信),bindService的生命周期有四個(gè)函數(shù)狰住,分別是onCreate()张吉、onBind()onUnBind()onDestory()催植,首次啟動(dòng)會(huì)先執(zhí)行onCreate()方法創(chuàng)建服務(wù)肮蛹,onBind() 會(huì)將調(diào)用者和服務(wù)綁定在一起勺择,調(diào)用者退出時(shí)可以調(diào)用unbindService()進(jìn)行解綁操作(方法中會(huì)調(diào)用onUnBind和onDestory)。(注:多次調(diào)用bindService()方法并不會(huì)導(dǎo)致多次創(chuàng)建服務(wù)及綁定(也就是說(shuō)onCreate()和onBind()方法并不會(huì)被多次調(diào)用)蔗崎。)

2.Service 的生命周期

Service 的生命周期
  • 回調(diào)方法含義:

    • onCreate:服務(wù)第一次被創(chuàng)建時(shí)調(diào)用酵幕;
    • onStartComand:服務(wù)啟動(dòng)時(shí)調(diào)用;
    • onBind:服務(wù)被綁定時(shí)調(diào)用缓苛;
    • onUnBind:服務(wù)被解綁時(shí)調(diào)用芳撒;
    • onDestroy:服務(wù)停止時(shí)調(diào)用;
  • 生命周期:

    • 只調(diào)用 startService() 啟動(dòng)服務(wù):onCreate() -> onStartCommand() -> onDestory()
    • 只調(diào)用 bindService() 綁定服務(wù):onCreate() -> onBind() -> onUnBind() -> onDestory()
    • 同時(shí)使用startService()與bindService():onCreate() -> onStartCommnad() -> onBind() -> onUnBind() -> onDestory未桥。
  • 種類:

    • startService():開(kāi)啟Service笔刹,調(diào)用者退出后Service仍然存在
    • bindService():開(kāi)啟Service冬耿,調(diào)用者退出后Service也隨即退出舌菜。
  • 啟動(dòng)方式:

    • startService():通過(guò)startService()方法可以啟動(dòng)一個(gè)Service,并回調(diào)服務(wù)中的onStartCommand()亦镶。如果首次創(chuàng)建日月,那么回調(diào)的順序是onCreate()->onStartCommand()。服務(wù)啟動(dòng)了之后會(huì)一直保持運(yùn)行狀態(tài)缤骨,直到stopService()stopSelf()方法被調(diào)用爱咬,服務(wù)停止并自動(dòng)回調(diào)onDestroy()。另外绊起,無(wú)論調(diào)用多少次startService()方法精拟,只需調(diào)用一次stopService()stopSelf()方法,服務(wù)就會(huì)停止了虱歪。onCreate()只在第一次創(chuàng)建的時(shí)候調(diào)用蜂绎,onStartCommand()每次啟動(dòng)服務(wù)都調(diào)用。
    • bindService():通過(guò)bindService()可以綁定一個(gè)Service笋鄙,并回調(diào)服務(wù)中的onBind()方法师枣。類似地,如果該服務(wù)之前還沒(méi)創(chuàng)建萧落,那么回調(diào)的順序是onCreate()->onBind()坛吁。之后,調(diào)用方可以獲取到onBind()方法里返回的IBinder對(duì)象的實(shí)例铐尚,從而實(shí)現(xiàn)和服務(wù)進(jìn)行通信拨脉。只要調(diào)用方和服務(wù)之間的連接沒(méi)有斷開(kāi),服務(wù)就會(huì)一直保持運(yùn)行狀態(tài)宣增,直到調(diào)用了unbindService()方法服務(wù)會(huì)停止玫膀,回調(diào)順序onUnBind()->onDestroy()
    • 注意爹脾,這兩種啟動(dòng)方法并不沖突帖旨,當(dāng)使用startService()啟動(dòng)Service之后箕昭,還可再使用bindService()綁定,只不過(guò)需要同時(shí)調(diào)用 stopService()和 unbindService()方法才能讓服務(wù)銷毀掉解阅。

3.Service的基本用法(startService落竹、bindService和IntentService)

3.1 startService

  • 第一步:新建類并繼承Service且必須重寫(xiě)onBind()方法,有選擇的重寫(xiě)onCreate()货抄、onStartCommand()及onDestroy()方法述召。
  • 第二步:在配置文件AndroidManifest.xml中進(jìn)行注冊(cè),否則不能生效蟹地。
  • 第三步:在 Activity 中利用 startService(Intent) 可實(shí)現(xiàn) Service 的啟動(dòng)积暖。
  • 第四步:在 Activity 中 stopService(Intent) 停止服務(wù),或者在Service任意位置調(diào)用stopSelf()怪与;
public class MyService extends Service {

    public MyService() {
    }
    @Override
    public void onCreate() {
        super.onCreate();
    }
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                //處理具體的邏輯
                //必須調(diào)用stopService或者stopSelf方法才能停止
                stopSelf();
            }
        }).start();
        return super.onStartCommand(intent, flags, startId);
    }
    @Override
    public void onDestroy() {
        super.onDestroy();
    }
    @Override
    public IBinder onBind(Intent intent) {
        throw new UnsupportedOperationException("Not yet implemented");
    }
}
//在配置文件AndroidManifest.xml中進(jìn)行注冊(cè)
<service
    android:name=".MyService"
    android:enabled="true"
    android:exported="true" />

//啟動(dòng)
Intent intent = new Intent(this, MyService.class);
 startService(intent);
//停止
Intent intent = new Intent(this, MyService.class);
stopService(intent);

3.2 bindService

  • 第一步:創(chuàng)建BindService服務(wù)端夺刑,繼承自Service,并在類中創(chuàng)建一個(gè)實(shí)例IBinder接口實(shí)現(xiàn)對(duì)象并提供公共方法給客戶端調(diào)用分别。
  • 第二步:從 onBind() 回調(diào)方法返回此Binder實(shí)例遍愿;
  • 第三步:在客戶端中,從onServiceConnected()回調(diào)方法接收Binder耘斩,并使用提供的方法調(diào)用綁定服務(wù)沼填。
  • 綁定服務(wù)提供了客戶端和服務(wù)端接口,進(jìn)行數(shù)據(jù)的交互(發(fā)送請(qǐng)求煌往、獲取結(jié)果、進(jìn)程間通信)
public class TestService extends Service {
    private Mybinder mBinder = new Mybinder();
    public TestService() {
    }
    @Override
    public IBinder onBind(Intent intent) {
        return mBinder;
    }
    public class Mybinder extends Binder {
        public void showToast() {
            Toast.makeText(getApplicationContext(), "BindService", Toast.LENGTH_SHORT).show();
        }
    }
}

public class MainActivity extends AppCompatActivity {
    private TestService.Mybinder mBinder;
    private ServiceConnection mConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            //成功綁定
            mBinder = (TestService.Mybinder) service;
            mBinder.showToast();
        }
        @Override
        public void onServiceDisconnected(ComponentName name) {
            //斷開(kāi)連接
        }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //綁定服務(wù)
        Intent bindIntent = new Intent(this, TestService.class);
        bindService(bindIntent, mConnection, BIND_AUTO_CREATE);
        //解綁服務(wù)
        unbindService(mConnection);
    }
}

3.3 IntentService

第一步:新建類并繼承IntentService轧邪,在這里需要提供一個(gè)無(wú)參的構(gòu)造函數(shù)且必須在其內(nèi)部調(diào)用父類的有參構(gòu)造函數(shù)刽脖,然后具體實(shí)現(xiàn)在onHandleIntent()方法,這里可以去處理一些耗時(shí)操作而不用擔(dān)心 ANR 的問(wèn)題忌愚,因?yàn)檫@個(gè)方法已經(jīng)是在子線程中運(yùn)行的了曲管。
第二步:在配置文件中進(jìn)行注冊(cè)。
第三步:在活動(dòng)中利用startService(Intent)實(shí)現(xiàn)IntentService的啟動(dòng)硕糊,和Service用的方法是完全一樣的院水。

public class MyIntentService extends IntentService {

    public MyIntentService() {
        super("MyIntentService");
    }
    @Override
    protected void onHandleIntent(Intent intent) {
        //子線程 耗時(shí)操作
    }
    @Override
    public void onDestroy() {
        super.onDestroy();
    }
}
//調(diào)用方法
Intent intentService = new Intent(this, MyIntentService.class);
startService(intentService);

4.Activity如何與Service通信?

在 Activity 中可以通過(guò) startService 和 bindService 方法啟動(dòng) Service简十。一般情況下如果想獲取 Service 的服務(wù)對(duì)象那么肯定需要通過(guò)bindService()方法檬某,比如音樂(lè)播放器,第三方支付等螟蝙。如果僅僅只是為了開(kāi)啟一個(gè)后臺(tái)任務(wù)那么可以使用 startService() 方法恢恼。

  1. 首先定義 MyService 來(lái)指定具體的操作。
  2. 先在 Activity 里實(shí)現(xiàn)一個(gè)ServiceConnection類 connection胰默,重寫(xiě) onServiceConnected 和 onServiceDisconnected 方法场斑,分別表示綁定成功與斷開(kāi)漓踢;
  3. 并將 connection 傳遞給 bindService() 方法去啟動(dòng) Service;
  4. 在ServiceConnection的onServiceConnected()方法里啟動(dòng) MyService 里的方法漏隐。
  5. 最后通過(guò) unbindService 來(lái)解綁服務(wù)喧半。

5.IntentService是什么?

IntentService是Service的子類青责,是一個(gè)異步的挺据、會(huì)自動(dòng)停止的服務(wù),很好解決了傳統(tǒng)的Service中處理完耗時(shí)操作忘記停止并銷毀Service的問(wèn)題爽柒。

  • IntentService 是一個(gè)特殊的 Service吴菠,它繼承了 Service 并且它是一個(gè)抽象類,因此必須創(chuàng)建它的子類才能使用 IntentService浩村。
  • 它封裝了 HandlerThread 和 Handler做葵,可用于執(zhí)行后臺(tái)耗時(shí)的任務(wù),當(dāng)任務(wù)全部執(zhí)行完畢后自動(dòng)停止心墅。
  • 它的優(yōu)先級(jí)比普通線程要高酿矢,所以適合執(zhí)行高優(yōu)先級(jí)的后臺(tái)任務(wù)。
  • (HandlerThread是繼承了Thread怎燥,他的作用是不用每次創(chuàng)建線程瘫筐,他內(nèi)部有循環(huán)機(jī)制可以重復(fù)利用,不用的時(shí)候要quit或者quitSafely铐姚。)

6.說(shuō)說(shuō) Activity策肝、Intent 和 Service 是什么關(guān)系

他們都是 Android 開(kāi)發(fā)中使用頻率最高的類。其中 Activity 和 Service 都是 Android 四大組件之一隐绵。他倆都是 Context 類的子類 ContextWrapper 的子類之众,因此他倆可以算是兄弟關(guān)系吧。不過(guò)兄弟倆各有各自的本領(lǐng)依许,Activity 負(fù)責(zé)用戶界面的顯示和交互棺禾,Service 負(fù)責(zé)后臺(tái)任務(wù)的處理。Activity 和 Service 之間可以通過(guò) Intent 傳遞數(shù)據(jù)峭跳,因此可以把 Intent 看作是通信使者膘婶。


7.如何保證Service不被殺死?(就是提高Service優(yōu)先級(jí))

  • 在AndroidManifest.xml配置文件設(shè)置android:priority 屬性蛀醉,和有序廣播一樣悬襟。
  • 在onStartCommand里面調(diào)用 startForeground()方法把Service提升為前臺(tái)進(jìn)程級(jí)別,然后再onDestroy里面要記得調(diào)用stopForeground()方法拯刁。
  • onStartCommand方法古胆,手動(dòng)返回START_STICKY。
  • 在onDestroy方法里發(fā)廣播重啟service。service +broadcast 方式逸绎,就是當(dāng)service走ondestory的時(shí)候惹恃,發(fā)送一個(gè)自定義的廣播,當(dāng)收到廣播的時(shí)候棺牧,重新啟動(dòng)service巫糙。(第三方應(yīng)用或是在setting里-應(yīng)用-強(qiáng)制停止時(shí),APP進(jìn)程就直接被干掉了颊乘,onDestroy方法都進(jìn)不來(lái)参淹,所以無(wú)法保證會(huì)執(zhí)行)
  • 監(jiān)聽(tīng)系統(tǒng)廣播判斷Service狀態(tài)。通過(guò)系統(tǒng)的一些廣播乏悄,比如:手機(jī)重啟浙值、界面喚醒、應(yīng)用狀態(tài)改變等等監(jiān)聽(tīng)并捕獲到檩小,然后判斷我們的Service是否還存活开呐。

8.Service 和 BroadcastReceiver 共同點(diǎn)

  • 都是運(yùn)行在主線程當(dāng)中,都不能做長(zhǎng)時(shí)間的耗時(shí)操作规求。

9.Service 里面可以彈吐司么

可以的筐付,Service不僅可以彈Toast還能彈出對(duì)話框,第一阻肿,Service是運(yùn)行在主線程當(dāng)中瓦戚;第二,彈吐司有個(gè)條件就是得有一個(gè) Context 上下文丛塌,而 Service 本身就是 Context 的子類较解;因此在 Service 里面彈吐司是完全可以的。


10.是否能在Service進(jìn)行耗時(shí)操作赴邻?如果非要可以怎么做印衔?

Service默認(rèn)運(yùn)行在主線程中,所以不能在Service里執(zhí)行耗時(shí)操作乍楚,除非手動(dòng)打開(kāi)一個(gè)子線程当编,否則有可能出現(xiàn)主線程被阻塞(ANR)的情況届慈。(開(kāi)啟子線程的方法有:繼承徒溪、實(shí)現(xiàn)、匿名類) 金顿,但我更建議使用IntentService來(lái)代替臊泌,因?yàn)樗且粋€(gè)異步的、會(huì)自動(dòng)停止的Service服務(wù)揍拆。


11.一個(gè)Activty先start一個(gè)Service后渠概,再bind時(shí)會(huì)回調(diào)什么方法?此時(shí)如何做才能回調(diào)Service的destory()方法?

當(dāng)對(duì)一個(gè)服務(wù)既調(diào)用 startService() 方法播揪,又調(diào)用了bindService()方法贮喧,根據(jù)Android系統(tǒng)的機(jī)制,一個(gè)服務(wù)只要被啟動(dòng)或者被綁定了之后猪狈,就會(huì)一直處于運(yùn)行狀態(tài)箱沦,必須要讓以上兩種條件同時(shí)不滿足,服務(wù)才能被銷毀雇庙。所以谓形,這種情況要同時(shí)調(diào)用是stopService()和unbindService方法,onDestroy才會(huì)執(zhí)行疆前。


12.前臺(tái)服務(wù)是什么寒跳?和普通服務(wù)的不同?如何去開(kāi)啟一個(gè)前臺(tái)服務(wù)竹椒?

前臺(tái)服務(wù)和普通服務(wù)最大的區(qū)別是:前者會(huì)一直有一個(gè)正在運(yùn)行的圖標(biāo)在系統(tǒng)的狀態(tài)欄顯示童太,下拉狀態(tài)欄后可以看到更加詳細(xì)的信息,非常類似于通知的效果碾牌。使用前臺(tái)服務(wù)或者為了防止服務(wù)被回收掉康愤,比如聽(tīng)歌,或者由于特殊的需求舶吗,比如實(shí)時(shí)天氣狀況征冷。

想要實(shí)現(xiàn)一個(gè)前臺(tái)服務(wù)非常簡(jiǎn)單,它和之前學(xué)過(guò)的發(fā)送一個(gè)通知非常類似誓琼,只不過(guò)在構(gòu)建好一個(gè)Notification之后检激,不需要NotificationManager將通知顯示出來(lái),而是調(diào)用了startForeground()方法腹侣。

//修改MyService的onCreate()方法:
public void onCreate(){
        Intent intent = new Intent(this,MainActivity.class);
        PendingIntent pi = PendingIntent.getActivity(this,0,intent,0);
        Notification notification = new NotificationCompat.Builder(this)
                .setContentTitle("This is content title")
                .setContentText("This is content text")
                .setWhen(System.currentTimeMillis())
                .setSmallIcon(R.mipmap.ic_launcher)
                .setLargeIcon(BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher))
                .setContentIntent(pi)
                .build();
        startForeground(1,notification);
}

13.是否了解ActivityManagerService叔收,談?wù)勊l(fā)揮什么作用?

ActivityManagerService是Android中最核心的服務(wù) 傲隶, 主要負(fù)責(zé)系統(tǒng)中四大組件的啟動(dòng)饺律、切換、調(diào)度及應(yīng)用進(jìn)程的管理和調(diào)度等工作跺株,其職責(zé)與操作系統(tǒng)中的進(jìn)程管理和調(diào)度模塊類似复濒。


14.用過(guò)哪些系統(tǒng)Service?

系統(tǒng)服務(wù)

15.AlarmManager能實(shí)現(xiàn)定時(shí)的原理乒省?

通過(guò)調(diào)用AlarmManager的 set() 方法就可以設(shè)置一個(gè)定時(shí)任務(wù)巧颈,并提供三個(gè)參數(shù)(工作類型,定時(shí)任務(wù)觸發(fā)的時(shí)間袖扛,PendingIntent對(duì)象)砸泛。其中第三個(gè)PendingIntent對(duì)象是關(guān)鍵,一般會(huì)調(diào)用它的 getBroadcast() 方法來(lái)獲取一個(gè)能夠執(zhí)行廣播的PendingIntent。這樣當(dāng)定時(shí)任務(wù)被觸發(fā)的時(shí)候唇礁,廣播接收器的onReceive()方法就可以得到執(zhí)行勾栗。即通過(guò)服務(wù)和廣播的循環(huán)觸發(fā)實(shí)現(xiàn)定時(shí)服務(wù)。


16.Service 和 Thread 的區(qū)別

  • 定義

    • Thread 是程序執(zhí)行的最小單元盏筐,它是分配CPU的最小單位械姻。可以執(zhí)行異步操作机断,是相對(duì)獨(dú)立的楷拳。
    • Service 是 Android 的一種特殊機(jī)制,是運(yùn)行在主線程當(dāng)中的吏奸,是依托于所在的主線程欢揖。是由系統(tǒng)進(jìn)程托管,也是一種輕量級(jí)IPC通信方式(Activity 和 Service 綁定奋蔚,然后數(shù)據(jù)通信她混,并處于不同進(jìn)程。)
  • 關(guān)系:Service 和 Thread 之間并沒(méi)有什么關(guān)聯(lián)泊碑,Service 翻譯成中文是服務(wù)坤按,同時(shí)服務(wù)可以理解為后臺(tái)窘拯。Thread 是開(kāi)啟子線程執(zhí)行耗時(shí)操作其屏,而 Service 是在主線程中執(zhí)行,但總被認(rèn)為可以在后臺(tái)處理耗時(shí)任務(wù)吗浩,容易混淆了兩者之間的概念腹忽。

  • 實(shí)際開(kāi)發(fā)中:在Android系統(tǒng)當(dāng)中来累,線程一般指的是工作線程,主線程主要負(fù)責(zé)UI繪制窘奏,而Service 就是運(yùn)行在主線程當(dāng)中的嘹锁。

  • 應(yīng)用場(chǎng)景

    • 當(dāng)需要耗時(shí)的操作,比如網(wǎng)絡(luò)請(qǐng)求着裹,圖片加載等等都應(yīng)該使用工作線程领猾。
    • 當(dāng)需要在后臺(tái)播放音樂(lè)、開(kāi)啟定位骇扇、數(shù)據(jù)統(tǒng)計(jì)等等應(yīng)該使用Service摔竿。
  • 區(qū)分

    • 1.不要把后臺(tái)和子線程聯(lián)系在一起;
    • 2.服務(wù)和后臺(tái)是不同的概念匠题;
    • 3.Android的后臺(tái)是指它的運(yùn)行不依賴與UI線程拯坟,即使程序被銷毀了但金、程序被關(guān)閉了韭山,服務(wù)進(jìn)程仍然在后臺(tái)進(jìn)行計(jì)算、統(tǒng)計(jì)等等。
    • 4.如果在 Service 執(zhí)行耗時(shí)钱磅,也需要?jiǎng)?chuàng)建子線程梦裂,然后去做耗時(shí)邏輯。
    • 5.Service是為了彌補(bǔ) Activity 被銷毀之后盖淡,無(wú)法獲取之前所創(chuàng)建的子線程實(shí)例年柠,并對(duì)后臺(tái)進(jìn)行控制的情況而產(chǎn)生的

17.開(kāi)啟子線程的方法

// 1褪迟、新建類繼承自Thread冗恨,然后重寫(xiě)父類的run方法,并在里面編寫(xiě)耗時(shí)邏輯味赃。
class MyThread extends Thread{
    public void run(){
    }
}
new MyThread().start();
// 2掀抹、實(shí)現(xiàn)Runnable接口可以降低繼承的耦合性
class MyThread implements Runnable{
    public void run(){
    }
}
MyThread my = new MyThread();
new Thread(my).start();
// 3、使用匿名類的方式心俗,這種方式最常見(jiàn)
new Thread(new Runnable(){
    public void run(){
    }
}).start()

18.Service 的 onStartCommand 方法有幾種返回值?各代表什么意思?

有四種返回值,不同值代表的意思如下:

  • START_STICKY:如果 service 進(jìn)程被 kill 掉,保留 service 的狀態(tài)為開(kāi)始狀態(tài),但不保留遞送的 intent 對(duì)象傲武。隨 后系統(tǒng)會(huì)嘗試重新創(chuàng)建 service,由于服務(wù)狀態(tài)為開(kāi)始狀態(tài),所以創(chuàng)建服務(wù)后一定會(huì)調(diào)用 onStartCommand(Intent,int,int)方法。如果在此期間沒(méi)有任何啟動(dòng)命令被傳遞到 service,那么參數(shù) Intent 將為 null城榛。
  • START_NOT_STICKY:“非粘性的”揪利。使用這個(gè)返回值時(shí),如果在執(zhí)行完 onStartCommand 后,服務(wù)被異常 kill 掉,系統(tǒng)不會(huì)自動(dòng)重啟該服務(wù)。
  • START_REDELIVER_INTENT:重傳 Intent狠持。使用這個(gè)返回值時(shí),如果在執(zhí)行完 onStartCommand 后,服務(wù)被異 常 kill 掉,系統(tǒng)會(huì)自動(dòng)重啟該服務(wù),并將 Intent 的值傳入疟位。
  • START_STICKY_COMPATIBILITY: START_STICKY 的兼容版本,但不保證服務(wù)被 kill 后一定能重啟。

你一般在什么情況下會(huì)使用Service喘垂?

當(dāng)需要長(zhǎng)期在后臺(tái)進(jìn)行的工作我們需要將其放在Service中去做献汗,比如音樂(lè)播放、下載王污、上傳大文件罢吃、定時(shí)關(guān)閉應(yīng)用等功能。這樣做的原因是如果放在Activity當(dāng)中去執(zhí)行的話昭齐,當(dāng)Activity銷毀后尿招,那這些功能也就停止了,這顯然是不符合我們的設(shè)計(jì)要求的阱驾,所以要將他們放在Service中去執(zhí)行就谜。


了解Binder機(jī)制

http://www.reibang.com/p/da76ffa0c859


本文參考資料:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市里覆,隨后出現(xiàn)的幾起案子丧荐,更是在濱河造成了極大的恐慌,老刑警劉巖喧枷,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件虹统,死亡現(xiàn)場(chǎng)離奇詭異弓坞,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)车荔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門渡冻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人忧便,你說(shuō)我怎么就攤上這事族吻。” “怎么了珠增?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵超歌,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我蒂教,道長(zhǎng)握础,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任悴品,我火速辦了婚禮禀综,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘苔严。我一直安慰自己定枷,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布届氢。 她就那樣靜靜地躺著欠窒,像睡著了一般。 火紅的嫁衣襯著肌膚如雪退子。 梳的紋絲不亂的頭發(fā)上岖妄,一...
    開(kāi)封第一講書(shū)人閱讀 51,443評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音寂祥,去河邊找鬼荐虐。 笑死,一個(gè)胖子當(dāng)著我的面吹牛丸凭,可吹牛的內(nèi)容都是我干的福扬。 我是一名探鬼主播,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼惜犀,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼铛碑!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起虽界,我...
    開(kāi)封第一講書(shū)人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤汽烦,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后莉御,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體撇吞,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡俗冻,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了梢夯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡晴圾,死狀恐怖颂砸,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情死姚,我是刑警寧澤人乓,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站都毒,受9級(jí)特大地震影響色罚,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜账劲,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一戳护、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧瀑焦,春花似錦腌且、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至禀晓,卻和暖如春精续,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背粹懒。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工重付, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人凫乖。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓堪夭,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親拣凹。 傳聞我的和親對(duì)象是個(gè)殘疾皇子森爽,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354