四大組件之Service的介紹和相關問題

1.Service是否在main thread 中執行,service裏面是否能執行耗時的操作

        默認情況,如果沒有顯示的指service 所運行的進程,service 和activity 是運行在當前App 所在進程的 main thread(UI主線程)裏面

        service裏面不能執行時的操作(網絡請求,拷貝數據庫,大文件)

        特殊情況,可以在清單文件中配置 service 執行所在的進程,讓service 在另外的進程中執行

  
  <service>
        android:name="com.niusiyu.location.Aservice"
        andorid:enable="true"
        android:process=":remote"
    </service>

2.Activity 怎麼和 Service綁定,怎麼在Activity 中啓動自己對應的 Service

        Activity 通過bindService(Intent service,ServiceConnection conn, int flag)跟Service 進行綁定,當綁定成功的時候Service會將代理對象通過回調的形式傳給conn,這樣我們就拿到了Service提供的服務代理對象

        在Activity 中可以通過startService 和bindService方法啓動Service。一般情況下如果想獲取Service 的服務對象那麼肯定需要通過bindService()方法,比如第三方支付等,如果僅僅只是爲了開啓一個後臺任務那麼可以使用startService()方法。

 

3.請描述一下 Service 的生命週期

Service 有綁定模式和非綁定模式,以及這兩種模式的混合使用方式。不同的使用方法生命週期方法也不同

        非綁定模式當第一次調用startService 的時候執行的方法依次爲 onCreate(),onStartCommand(),(onstart())當Service 關閉的時候調用onDestory方法。

        綁定模式:第一次bindService()的時候,執行的方法爲onCreate(),onBind() ,解除綁定的時候回執行onUnbind(),onDestory()。

        我們在開發的過程中還需要注意Service 實例只會有一個,也就是說如果當前要啓動的Service 已經存在了那麼就不會再創建,該Service當然也不會調用onCreate()方法。

        一個Service可以被多個客戶進行綁定,只有所有的綁定對象都執行了onBind()方法後該Service纔會銷燬,不過如果有一個客戶執行了onStart()方法,那麼這個時候如果所有的bind客戶都執行了unBind()該Service也不會銷燬。

4.什麼 是IntentService ?有何優點

        IntentService 是Service 的子類,比普通的Service 增加了額外的功能,先看Service 本身存在兩個問題,Service不會專門啓動一條單獨的進程,Service 與它所在應用位於同一個進程中;Service也不是專門一條新線程,因此不應該在Service 中直接處理耗時的任務;

        IntentService會創建獨立的worker 線程裏處理所有的Intent請求;會創建獨立的worker線程來處理onHandleIntent()方法實現的代碼,無需處理多線程問題;所有請求處理完成後,IntentService會自動停止,無需調用onSelf()方法停止Service;爲Service的onBind()提供默認實現,返回null;爲Service 的onStartCommand提供默認實現,將請求Intent添加到隊列中;

 

5.說說Activity ,Intent,Service 是什麼關係

        其實Activity 和 Service都是Android四大組件之一。他們都是Context類的子類ContextWrapper的子類,因此他倆可以算是兄弟關係吧。Activity負責用戶界面的顯示和交互,Service 負責後臺任務的處理。Activity 和 Service 之間可以通過Intent 傳遞數據,因此可以把Intent看作是通信使者。

 

6.Service 和 Activity 在同一個線程嗎

        對於同一app來說默認情況下是在同一個線程中的 main thread (UI Thread)

7.Service 裏面可以彈吐司麼

可以的,彈吐司有個條件就是得有一個Context 上下文,而Service 本身就是Context 的子類,因此在Service 裏面彈吐司是完全可以的。比如我們在Service 中完成下載任務後可以彈一個吐司通知用戶。

 

8.如何一個Service 成爲前置進程?

@Override
public int onStartCommand(Intent intent,int flags,int startId){
    Notification notification = Nitification(R.drawable.ic_launcher,"服務正在運行",System.currentTimeMillis());
    Intent notificationIntent = new Intent(this,MainActivity.class);
    PendingIntent pendingIntent.getActivity(this,0,notificationIntent,0);
    notification.setLatestEventInfo(this,"消息標題","消息內容",pendingIntent);
    startForeground(1,notification);
    return super.onStartCommand(intent,flags,startId);
}

 

9.Service 的onRebind(Intent)方法在什麼情況下會執行?

        如果在onUnbind()方法返回true的情況下會執行,否則不執行

 

10.Activity 調用Service中的方法都有哪些方式?

Activity調用Service中的方法主要是通過綁定服務的模式實現的,綁定服務又分爲三種方式

(1).通過Binder接口的形式實現,當Activity綁定Service 成功的時候Activity 會在ServiceConnection 的類的onServiceConnected()回調方法中獲取到Service 的onBind()方法return 過來的Binder的子類

(2).using a messenger

(3).using AIDL :aidl比較適合當客戶端和服務端不再同一個應用下的場景

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章