一堕汞、什么是Service?
Service是Android的四大組件之一勺爱,它可以在后臺(tái)運(yùn)行一些用戶不可見的任務(wù)(比如播放音樂、下載)臼朗。它還可以在應(yīng)用退出以后繼續(xù)保持運(yùn)行邻寿。
二蝎土、怎么使用Service?
1.首先要繼承Service類得到一個(gè)子類视哑。
2.跟Activity一樣,需要在AndroidManifest.xml文件中注冊(cè)
<service android:name=".Serevice.MyService"/>
3.與啟動(dòng)Activity類似誊涯,我們可以使用Intent來啟動(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()方法來啟動(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則可以解決這一問題淮捆。
創(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("通知來了")
/**設(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)行的通知。他們通常是用來表示一個(gè)后臺(tái)任務(wù),用戶積極參與(如播放音樂)或以某種方式正在等待,因此占用設(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);
}
通過初始化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í)行蚁飒。
通過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ù)