【一】使用Service
在額敏等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供網(wǎng)站建設(shè)、成都網(wǎng)站建設(shè) 網(wǎng)站設(shè)計制作按需策劃設(shè)計,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站設(shè)計,成都營銷網(wǎng)站建設(shè),外貿(mào)網(wǎng)站建設(shè),額敏網(wǎng)站建設(shè)費用合理。
這節(jié)課程內(nèi)容包括:使用Service、綁定Service、Service的生命周期
Activity能夠呈現(xiàn)用戶界面,與用戶進(jìn)行交互,
而很多時候,我們程序不需要與用戶交互,只需要一直在后臺運行,
做一些事物處理,例如:Socket長連接、Http網(wǎng)絡(luò)通信、與服務(wù)器保持推送的連接。
如何創(chuàng)建Service?
建一個繼承于Service的子類,然后在AndroidManifest.xml中配置即可。
public class MyService extends Service{ public IBinder onBind(Intent intent){ throw new UnsupportOperationException("Not yet implemented"); } }
android:exported —— 是否向外界公開
android:enabled —— 是否啟用
如何啟動Service?
新建一個Button,在MainActivity中給它設(shè)置一個事件監(jiān)聽器,然后
startService(new Intent(MainActivity.this,MyService.class));
這樣就能啟動服務(wù),接下來建一個停止服務(wù)的Button,寫上
stopService(new Intent(MainActivity.this,MyService.class))
疑問:啟動和停止都創(chuàng)建了一個Intent,這兩個新創(chuàng)建的Intent實例,是否操作是同一個服務(wù)呢?
回答:是同一個服務(wù)。因為服務(wù)的實例,在操作系統(tǒng)上,只可能有那么一個。
把Intent定義為成員變量,startService和stopService都傳入這同一個Intent,效果還是一樣的,
因為Intent只是用來配置程序要啟動Service的信息的,具體所要操作的Service還是同一個Service。
在"系統(tǒng)設(shè)置"-"應(yīng)用"-"運行中"就可以看我們寫的服務(wù)是否啟動。
現(xiàn)在補充一下,讓我們的Service在后臺不斷執(zhí)行輸出語句,
這需要重寫onStartCommand方法:
public class MyService extends Service{ public IBinder onBind(Intent intent){ throw new UnsupportOperationException("Not yet implemented"); } @Override public int onStartCommand(Intent intent,int flags,int startId){ new Thread(){ public void run(){ super.run(); while(true){ System.out.println("服務(wù)正在運行"); } try{ sleep(100); }catch(InterruptedException e){ e.printStackTrace(); } } }.start(); return super.onStartCommand(intent,flag,startId); } }
這樣,如果啟動了服務(wù),就算Activity已經(jīng)退出,它仍然會在后臺執(zhí)行。
【二】綁定Service
啟動Service還能用綁定Service的方式來啟動,如何綁定?
在MainActivity加兩個Button,一個"BindService",一個"UnBindService"。
它們觸發(fā)的方法分別是bindService()和unbindService()。
bindService()有三個參數(shù),Intent、服務(wù)的連接(用于監(jiān)聽服務(wù)的狀態(tài),這里傳入)、傳一個常量Context.BIND_AUTO_CREATE。
第二個參數(shù)需要MainActivity實現(xiàn)ServiceConnection接口,需要實現(xiàn)重寫以下的方法:
@Override public void onServiceConnected(ComponentName name, IBinder service) { Toast.makeText(MainActivity.this, "onServiceConnected", Toast.LENGTH_SHORT).show(); } @Override public void onServiceDisconnected(ComponentName name) { }
onServiceConnected在服務(wù)被綁定成功時執(zhí)行,
onServiceDisconnected在服務(wù)所在進(jìn)行崩潰或被殺掉時被執(zhí)行。
unbindService()的參數(shù)就是this。
接下來執(zhí)行程序,會發(fā)現(xiàn)出錯:
java.lang.RuntimeException: Unable to bind to service com.linww.demo.learnservice.MyService@23e111e3 with Intent { cmp=com.linww.demo.learnservice/.MyService }: java.lang.UnsupportedOperationException: Not yet implemented
通過查看發(fā)現(xiàn)是onBind這里拋異常,在這方法返回一個Binder()對象就OK了。
@Override public IBinder onBind(Intent intent) { // TODO: Return the communication channel to the service. // throw new UnsupportedOperationException("Not yet implemented"); return new Binder(); }
【三】Service的生命周期
服務(wù)生命周期只需要記得有 onCreate()和onDestroy()。
規(guī)律:同時啟動服務(wù)并且綁定服務(wù),必須同時停止和解除綁定,服務(wù)才能被停止。
如果Activity與某一個Service綁定,那么退出這個Activity,Service也會被取消綁定。
關(guān)于onStartCommand()方法,如果Service第一次啟動,是onCreate()后執(zhí)行onStartCommand();
而如果Service已經(jīng)被啟動過了,那么再去啟動它,例如點擊啟動按鈕,
則只會執(zhí)行onStartCommand(),不會重復(fù)執(zhí)行onCreate()。