日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > Android >内容正文

Android

Android 四大组件 —— 服务

發(fā)布時(shí)間:2023/12/9 Android 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android 四大组件 —— 服务 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、服務(wù)是什么

????????服務(wù)(Service)是Android?中實(shí)現(xiàn)程序后臺(tái)運(yùn)行的解決方案,它非常適合用于去執(zhí)行那些不需要和用戶(hù)交互而且還要求長(zhǎng)期運(yùn)行的任務(wù)。服務(wù)的運(yùn)行不依賴(lài)于任何用戶(hù)界面,即使當(dāng)程序被切換到后臺(tái),或者用戶(hù)打開(kāi)了另外一個(gè)應(yīng)用程序,服務(wù)仍然能夠保持正常運(yùn)行。

?????? 不過(guò)需要注意的是,服務(wù)并不是運(yùn)行在一個(gè)獨(dú)立的進(jìn)程當(dāng)中的,而是依賴(lài)于創(chuàng)建服務(wù)時(shí)所在的應(yīng)用程序進(jìn)程。當(dāng)某個(gè)應(yīng)用程序進(jìn)程被殺掉時(shí),所有依賴(lài)于該進(jìn)程的服務(wù)也會(huì)停止運(yùn)行。

??????另外,也不要被服務(wù)的后臺(tái)概念所迷惑,實(shí)際上服務(wù)并不會(huì)自動(dòng)開(kāi)啟線(xiàn)程,所有的代碼都是默認(rèn)運(yùn)行在主線(xiàn)程當(dāng)中的。也就是說(shuō),我們需要在服務(wù)的內(nèi)部手動(dòng)創(chuàng)建子線(xiàn)程,并在這里執(zhí)行具體的任務(wù),否則就有可能出現(xiàn)主線(xiàn)程被阻塞住的情況。

?

二、服務(wù)的基本用法

?????? 了解了Android 多線(xiàn)程編程的技術(shù)之后,下面就讓我們進(jìn)入到本章的正題,開(kāi)始對(duì)服務(wù)的相關(guān)內(nèi)容進(jìn)行學(xué)習(xí)。作為Android 四大組件之一,服務(wù)也少不了有很多非常重要的知識(shí)點(diǎn),那我們自然要從最基本的用法開(kāi)始學(xué)習(xí)了。

1 、定義一個(gè)服務(wù)

?????? 首先看一下如何在項(xiàng)目中定義一個(gè)服務(wù)。新建一個(gè)ServiceTest 項(xiàng)目,然后在這個(gè)項(xiàng)目中新增一個(gè)名為MyService 的類(lèi),并讓它繼承自Service,完成后的代碼如下所示

[java]?view plaincopy
  • public?class?MyService?extends?Service?{??
  • ????@Override??
  • ????public?IBinder?onBind(Intent?intent)?{??
  • ????????//?TODO?Auto-generated?method?stub??
  • ????????return?null;??
  • }??
  • ?????? 目前MyService 中可以算是空空如也,但有一個(gè)onBind()方法特別醒目。這個(gè)方法是Service 中唯一的一個(gè)抽象方法,所以必須要在子類(lèi)里實(shí)現(xiàn)。我們會(huì)在后面的小節(jié)中使用到onBind()方法,目前可以暫時(shí)將它忽略掉。

    ?????? 既然是定義一個(gè)服務(wù),自然應(yīng)該在服務(wù)中去處理一些事情了,那處理事情的邏輯應(yīng)該寫(xiě)在哪里呢?這時(shí)就可以重寫(xiě)Service 中的另外一些方法了,如下所示:

    [java]?view plaincopy
  • public?class?MyService?extends?Service?{??
  • ??
  • ????@Override??
  • ????public?IBinder?onBind(Intent?intent)?{??
  • ????????//?TODO?Auto-generated?method?stub??
  • ????????return?null;??
  • ????}??
  • ??
  • ????@Override??
  • ????public?void?onCreate()?{??
  • ????????//?TODO?Auto-generated?method?stub??
  • ????????super.onCreate();??
  • ????????Log.v("MainActivity",?"onCreate");??
  • ????}??
  • ??????
  • ????@Override??
  • ????public?void?onStart(Intent?intent,?int?startId)?{??
  • ????????//?TODO?Auto-generated?method?stub??
  • ????????super.onStart(intent,?startId);??
  • ????????Log.v("MainActivity",?"onStart");??
  • ????}??
  • ??????
  • ????@Override??
  • ????public?void?onDestroy()?{??
  • ????????//?TODO?Auto-generated?method?stub??
  • ????????super.onDestroy();??
  • ????????Log.v("MainActivity",?"onDestroy");??
  • ????}??
  • }??
  • ?????? 可以看到,這里我們又重寫(xiě)了onCreate()、onStartCommand()和onDestroy()這三個(gè)方法,它們是每個(gè)服務(wù)中最常用到的三個(gè)方法了。其中onCreate()方法會(huì)在服務(wù)創(chuàng)建的時(shí)候調(diào)用,onStartCommand()方法會(huì)在每次服務(wù)啟動(dòng)的時(shí)候調(diào)用,onDestroy()方法會(huì)在服務(wù)銷(xiāo)毀的時(shí)候調(diào)用。

    ?????通常情況下,如果我們希望服務(wù)一旦啟動(dòng)就立刻去執(zhí)行某個(gè)動(dòng)作,就可以將邏輯寫(xiě)在onStartCommand()方法里。而當(dāng)服務(wù)銷(xiāo)毀時(shí),我們又應(yīng)該在onDestroy()方法中去回收那些不再使用的資源。

    ?????另外需要注意,每一個(gè)服務(wù)都需要在AndroidManifest.xml 文件中進(jìn)行注冊(cè)才能生效,不知道你有沒(méi)有發(fā)現(xiàn),這是Android 四大組件共有的特點(diǎn)。于是我們還應(yīng)該修改AndroidManifest.xml文件,代碼如下所示:

    [java]?view plaincopy
  • <service???
  • ????????????android:name="cn.com.qiang.service.MyService">??
  • </service>??
  • 這樣的話(huà),就已經(jīng)將一個(gè)服務(wù)完全定義好了。

    ?

    2、啟動(dòng)和停止一個(gè)服務(wù)

    我們?cè)诓季治募屑尤肓藘蓚€(gè)按鈕,分別是用于啟動(dòng)服務(wù)和停止服務(wù)的。然后修改MainActivity 中的代碼,如下所示:

    [java]?view plaincopy
  • Button?button1?=?(Button)findViewById(R.id.button1);??
  • button1.setOnClickListener(new?OnClickListener()?{??
  • ??????????????
  • ????@Override??
  • ????public?void?onClick(View?v)?{??
  • ????????//?TODO?Auto-generated?method?stub??
  • ????????Intent?startintent?=?new?Intent(MainActivity.this,MyService.class);??
  • ????????startService(startintent);??
  • ????}??
  • });??
  • ??????????
  • Button?button2?=?(Button)findViewById(R.id.button2);??
  • button2.setOnClickListener(new?OnClickListener()?{??
  • ??????????????
  • ????@Override??
  • ????public?void?onClick(View?v)?{??
  • ????????//?TODO?Auto-generated?method?stub??
  • ????????Intent?stopintent?=?new?Intent(MainActivity.this,MyService.class);??
  • ????????stopService(stopintent);??
  • ????}??
  • });??
  • ?

    我們?nèi)绾尾拍茏C實(shí)服務(wù)已經(jīng)成功啟動(dòng)或者停止了呢?最簡(jiǎn)單的方法就是在MyService 的幾個(gè)方法中加入打印日志,可以看到我們?cè)贛yService中已經(jīng)加入了。

    下面我們看一下運(yùn)行效果:

    開(kāi)啟服務(wù)后,LogCat中打印

    關(guān)閉服務(wù)后,LogCat 中打印:

    總結(jié)

    以上是生活随笔為你收集整理的Android 四大组件 —— 服务的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。