一、什么是Service?
Service是Android的四大組件之一,它可以在后臺(tái)運(yùn)行一些用戶不可見的任務(wù)(比如播放音樂(lè)、下載)。它還可以在應(yīng)用退出以后繼續(xù)保持運(yùn)行。
二、怎么使用Service?
1.首先要繼承Service類得到一個(gè)子類。
2.跟Activity一樣,需要在AndroidManifest.xml文件中注冊(cè)
<service android:name=".Serevice.MyService"/>
3.與啟動(dòng)Activity類似,我們可以使用Intent來(lái)啟動(dòng)Service,啟動(dòng)方法為startService();
Intent startIntent = new Intent(this, MyService.class);
startService(startIntent);
Service與Activity不一樣,如果不主動(dòng)結(jié)束它的運(yùn)行,它會(huì)一直保持運(yùn)行。所以我們使用stopService()停止Service的運(yùn)行。
Intent stopIntent = new Intent(this, MyService.class);
stopService(stopIntent);
三、Activity怎么與Service通信?
可以使用bindService()方法將Activity與Service綁定,使用unbindService()解除綁定。也可以使用bindService()方法來(lái)啟動(dòng)Service,而這種綁定方式啟動(dòng)的Service,只有解除所有綁定,Service才會(huì)銷毀。
Intent bindIntent = new Intent(this, MyService.class);
bindService(bindIntent, connection, BIND_AUTO_CREATE);
其中connection聲明如下,其中onServiceConnected方法會(huì)在Service與Activity建立關(guān)聯(lián)的時(shí)候調(diào)用,可以在該方法里啟動(dòng)需要Service執(zhí)行的任務(wù)并得到返回值。onServiceDisconnected方法會(huì)在Service與Activity解除關(guān)聯(lián)的時(shí)候調(diào)用。
private ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
myBinder = (MyService.MyBinder) service;
myBinder.startDownload();
}
};
四、Service生命周期

五、前臺(tái)Service
一般情況下,Service都是在后臺(tái)運(yùn)行,但是也可以讓它運(yùn)行在前臺(tái)。
由于Service的系統(tǒng)優(yōu)先級(jí)比較低,后臺(tái)Service容易在系統(tǒng)內(nèi)存不足的時(shí)候被殺死,而前臺(tái)Service則可以解決這一問(wèn)題。
創(chuàng)建前臺(tái)service比較簡(jiǎn)單,在我們繼承自Service類的子類的onCreate()方法中新建一個(gè)Notification
public void showNotification(Context context) {
Notification notification = new NotificationCompat.Builder(context)
/**設(shè)置通知左邊的大圖標(biāo)**/
.setLargeIcon(BitmapFactory.decodeResource(context.getResources(), R.mipmap.ic_launcher))
/**設(shè)置通知右邊的小圖標(biāo)**/
.setSmallIcon(R.mipmap.ic_launcher)
/**通知首次出現(xiàn)在通知欄,帶上升動(dòng)畫效果的**/
.setTicker("通知來(lái)了")
/**設(shè)置通知的標(biāo)題**/
.setContentTitle("這是一個(gè)通知的標(biāo)題")
/**設(shè)置通知的內(nèi)容**/
.setContentText("這是一個(gè)通知的內(nèi)容這是一個(gè)通知的內(nèi)容")
/**通知產(chǎn)生的時(shí)間,會(huì)在通知信息里顯示**/
.setWhen(System.currentTimeMillis())
/**設(shè)置該通知優(yōu)先級(jí)**/
.setPriority(Notification.PRIORITY_DEFAULT)
/**設(shè)置這個(gè)標(biāo)志當(dāng)用戶單擊面板就可以讓通知將自動(dòng)取消**/
.setAutoCancel(true)
/**設(shè)置他為一個(gè)正在進(jìn)行的通知。他們通常是用來(lái)表示一個(gè)后臺(tái)任務(wù),用戶積極參與(如播放音樂(lè))或以某種方式正在等待,因此占用設(shè)備(如一個(gè)文件下載,同步操作,主動(dòng)網(wǎng)絡(luò)連接)**/
.setOngoing(false)
/**向通知添加聲音、閃燈和振動(dòng)效果的最簡(jiǎn)單、最一致的方式是使用當(dāng)前的用戶默認(rèn)設(shè)置,使用defaults屬性,可以組合:**/
.setDefaults(Notification.DEFAULT_VIBRATE | Notification.DEFAULT_SOUND | Notification.DEFAULT_LIGHTS)
.setContentIntent(PendingIntent.getActivity(context, 1, new Intent(context, MainActivity.class), PendingIntent.FLAG_CANCEL_CURRENT))
.build();
notification.flags = Notification.FLAG_SHOW_LIGHTS;
NotificationManager notificationManager = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE);
/**發(fā)起通知**/
notificationManager.notify(0, notification);
}
通過(guò)初始化Notification和調(diào)用它的展示方法,這樣該Service就變成了前臺(tái)service。
Notification的setContentIntent方法的參數(shù)是一個(gè)PendingIntent,它可以讓用戶點(diǎn)擊通知時(shí)去執(zhí)行預(yù)設(shè)的任務(wù),這里是打開MainActivity。
運(yùn)行該Service,可以看到系統(tǒng)通知欄出現(xiàn)了一個(gè)通知,點(diǎn)擊它會(huì)打開MainActivity。
六、什么是PendingIntent?
PendingIntent是一種特殊的Intent。它跟intent的立即執(zhí)行不一樣;它的執(zhí)行不是立即的,是需要滿足某些條件后才執(zhí)行。
通過(guò)PendingIntent典型的三個(gè)靜態(tài)方法可以得到其對(duì)象:
- 打開到一個(gè)activity組件
public static PendingIntent getActivity(Context context, int requestCode,
Intent intent, @Flags int flags)
- 打開一個(gè)廣播組件
public static PendingIntent getBroadcast(Context context, int requestCode,
Intent intent, @Flags int flags)
- 打開一個(gè)服務(wù)組件
public static PendingIntent getService(Context context, int requestCode,
@NonNull Intent intent, @Flags int flags)
因?yàn)镻endingIntent自己攜帶了Context,所以即使Intent所在的程序結(jié)束了,PendingIntent依然有效,可以在別的程序中被使用。
七、遠(yuǎn)程Service
待續(xù)