文章目錄
一、service的應用場景以及和Thread的區別
1、service是什麼?
1)可以在後臺處理一些耗時的邏輯、
2)可以執行長時間運行的任務在後臺開啓、
3)可以在程序退出的時候仍讓service保持一定的狀態即service保活
4)可以被activity和Broadcast呼起,即使該activity和Broadcast被銷燬了,service也可以活着
5)也可以把service綁定到activity可以進行互相通信,進程之間也可以通信
6)service和Broadcast都是運行在主線程,都不能做耗時操作
7)既然service運行在主線程,也不能直接執行耗時操作,爲什麼還需要service,而不是直接在activity中創建子線程執行耗時操作呢?
因爲在activity中Thread,當activity被銷燬後,你沒有辦法再獲得之前的thread;
而service可以運行在後臺,不必銷燬;activity就可以放心的創建銷燬;
2、service和Thread的區別
1)、定義上:android中 service、thread、後臺是不一樣的概念
service是由系統進程託管,service是一種輕量級的IPC通信,
2)、實際開發中:
service運行在主線程,不能執行耗時操作,不然會NAR,要開啓單獨線程
3)、應用場景
service : 播放音樂,開啓天氣預報的統計,數據統計等等
二、開啓service的兩種方式以及區別
1、startService
開啓服務,一旦該服務開啓,就會在後臺無限期的運行,activity被銷燬也不影響,除非你通過stopService關閉service。
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
Intent intent = new Intent(this, StartService.class);
startService(intent);
}
}
public class StartService extends Service {
/**
* 綁定服務時纔會調用
*/
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
/**
* 首次創建服務時。系統調用此方法進行一次性設置程序(在調用onStartCommend() 和onBind() 之前),
* 如果服務已經運行,則不會調用此方法,此方法只會調用一次
*/
@Override
public void onCreate() {
super.onCreate();
}
/**
* 1、每次通過startservice()方法啓動service時,都被調用
* 2、當返回值爲START_STICKY,表明service因爲系統內存不足被回收後,
* 在系統內存再次有空閒的時候,會重新啓動該service,並調用該方法,但是其中的Intent爲null
* 這種適用於像後臺播放器,天氣預報等
*/
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return super.onStartCommand(intent, flags, startId);
}
/**
* 服務銷燬時的回調
* 在這裏實現一些資源的清理:1、子線程 2、監聽器 3、 contentProvide
*/
@Override
public void onDestroy() {
super.onDestroy();
}
}
2、 bindService
public class BindActivity extends Activity {
private Service mService;
private ServiceConnection serviceConnection = new ServiceConnection(){
/**
* 與服務器端交互的接口方法,綁定服務的時候被回調,在這個方法獲取綁定的service傳遞過來的IBinder對象,
* 通過這個IBinder對象,實現宿主和service的交互
*/
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
//獲取Binder
BindService.LocalBinder binder = (BindService.LocalBinder)service;
mService = binder.getService();
}
/**
*當取消綁定的時候被回調,但正常情況下是不被調用的。
* 它的調用時機是當service被意外銷燬時,activity主動關閉service時不回調用該方法
* 例如內存資源不足時,該方法才被自動調用
*/
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = new Intent(this, BindService.class);
//開啓綁定
bindService(intent, serviceConnection, Service.BIND_AUTO_CREATE);
}
}
public class BindService extends Service {
private LocalBinder localBinder = new LocalBinder();
/**
* 創建Bind對象,返回給客戶端即activity使用,提供數據交換的接口
*/
public class LocalBinder extends Binder{
//聲明這個方法,getService(),提供給客戶端調用
BindService getService(){
//返回當前服務的對象,這樣我們就可以在客戶端調用service的public方法了
return BindService.this;
}
}
/**
* 綁定服務時纔會調用
*/
@Nullable
@Override
public IBinder onBind(Intent intent) {
return localBinder;
}
/**
* 首次創建服務時。系統調用此方法進行一次性設置程序(在調用onStartCommend() 和onBind() 之前),
* 如果服務已經運行,則不會調用此方法,此方法只會調用一次
*/
@Override
public void onCreate() {
super.onCreate();
}
/**
* 1、每次通過startservice()方法啓動service時,都被調用
* 2、當返回值爲START_STICKY,表明service因爲系統內存不足被回收後,
* 在系統內存再次有空閒的時候,會重新啓動該service,並調用該方法,但是其中的Intent爲null
* 這種適用於像後臺播放器,天氣預報等
*/
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return super.onStartCommand(intent, flags, startId);
}
@Override
public boolean onUnbind(Intent intent) {
return super.onUnbind(intent);
}
/**
* 服務銷燬時的回調
* 在這裏實現一些資源的清理:1、子線程 2、監聽器 3、 contentProvide
*/
@Override
public void onDestroy() {
super.onDestroy();
}
}