Service

一、什么是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ù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Service是Android四大組件中與Activity最相似的組件,他們都代表可執(zhí)行的程序,Service與A...
    AndYMJ閱讀 2,014評(píng)論 0 3
  • 前言:本文所寫的是博主的個(gè)人見解,如有錯(cuò)誤或者不恰當(dāng)之處,歡迎私信博主,加以改正!原文鏈接,demo鏈接 Serv...
    PassersHowe閱讀 1,516評(píng)論 0 5
  • 服務(wù)基本上分為兩種形式 啟動(dòng) 當(dāng)應(yīng)用組件(如 Activity)通過(guò)調(diào)用 startService() 啟動(dòng)服務(wù)時(shí)...
    pifoo閱讀 1,331評(píng)論 0 8
  • [文章內(nèi)容來(lái)自Developers] Service是一個(gè)可以在后臺(tái)執(zhí)行長(zhǎng)時(shí)間運(yùn)行操作而不提供用戶界面的應(yīng)用組件。...
    岳小川閱讀 941評(píng)論 0 7
  • ![《黃金時(shí)代》劇照](file:///storage/emulated/0/QQBrowser/圖片收藏/201...
    張某某T閱讀 501評(píng)論 0 1

友情鏈接更多精彩內(nèi)容