android学习之Service
? ? ? ?服務是安卓中的典型組件,一般組件都需要在清單文件中注冊。服務能夠長時間的運行在后臺,并且不提供用戶界面。其他的組件能夠開啟服務 并且在用戶在開啟其他應用的時候該服務仍然能夠繼續(xù)在后臺執(zhí)行。一個組件通過bind的方式綁定服務,并且該組件能與之交互。
最典型的案列就是播放音樂,播放器應用在后臺仍然能夠播放音樂。
服務,簡單的解釋就是,長期在后臺運行并且沒有界面的組件。類似天氣預報和股票顯示的應用,需要在后臺連接服務器,
每隔一段時間,獲取最新的數(shù)據(jù)。Service不需要在activity中開啟子線程。
服務有兩種開啟方式:
第一種:采用start的方式開啟服務
?
Intent intent = new Intent(this,MyService.class);startService(intent);這種方式類似于Activity的創(chuàng)建,通過Intent來實現(xiàn),同時停止服務和開啟服務類似:
?
?
Intent intent = new Intent(this,MyService.class);stopService(intent);用這種方式創(chuàng)建Service的生命周期如下:onCreate()--> onStartCommand() ?---> onDestory(),有一個onStart()的過時的方法,需要服務處理的邏輯一般在onStartCommand和onStart里面執(zhí)行。這里需要注意的幾點:
?
一、如果服務重復開啟,當再次執(zhí)行startService方法時,不再執(zhí)行onCreate方法,而是直接執(zhí)行onStartCommand方法;
二、服務停止的時候,顯然會執(zhí)行onDestory方法,并且只會執(zhí)行一次該方法,重復調用stopService方法時沒用的。
這種方式開啟服務的特點:采用start方式開啟的服務。一旦服務開啟了,就和開啟者沒有關系,這時候開啟者(一般是Activity組件)
被銷毀后,服務仍然在后臺執(zhí)行;這種方式開啟的服務還有一個缺點就是開啟者無法調用服務內部的方法,也就是無
法與服務進行交互。
第二種:采用bind的方式開啟服務
采用這種bind的方式開啟服務主要是為了能夠調用Service中的方法,那么如何通過綁定服務的方式來調用服務里面的方法呢? 可以分成5個步驟: 一、首先Service中要暴露出方法,定義一個內部類,這個內部類相當于中介,由中介這個內部成員來幫我們干活,即調用 Service內部的方法。 二、繼承Service默認有一個方法onBind,通過這個onBind將中介的信息傳遞出去,也就是返回一個new 出來的中介 對象,而且onBind的返回值是IBinder,而這個中介必須是IBinder類型,所以中介這個內部類需要繼承Binder類或實 現(xiàn)IBinder接口。 三、定義一個內部類實現(xiàn)ServiceConnection接口來獲得中介對象,以便能夠調用Service里面的方法。 四、在Activity中采用綁定的形式開啟服務。bindService(Intent service, ServiceConnection conn,int flags)這個方法有 三個參數(shù),第一個是一個意圖,第二個是ServiceConnection,這是一個接口,通過這個接口可以獲得第二步 中onBind方法返回的中介對象,所以這里需要我們去實現(xiàn)這個接口。第三個參數(shù)表示綁定服務的操作, 比如BIND_AUTO_CREATE-->表示綁定的時候自動創(chuàng)建服務。 五、通過中介調用Service里面的方法。 這就是以上五個步驟。 這種方式開啟服務時服務的生命周期: onCreate() --->onBind();--->onunbind()-->onDestory(); 綁定服務不會調用onstart或者onstartcommand方法;下面是第二種方式開啟的服務的部分代碼: package com.example.service;import android.app.Service; import android.content.Intent; import android.os.Binder; import android.os.IBinder;public class MyService extends Service {public MyService() {}@Override//2、返回中介對象public IBinder onBind(Intent intent) {return new Agency();}@Overridepublic void onCreate() {System.out.println("服務onCreate");super.onCreate();}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {System.out.println("服務onStartCommand");return super.onStartCommand(intent, flags, startId);}@Overridepublic void onDestroy() {System.out.println("服務onDestory");super.onDestroy();}public void methodInService() {System.out.println("服務里的方法被執(zhí)行");}/*** 1、中間人,相當于調用者Activity和Service之間的橋梁*/private class Agency extends Binder implements IAgency{public void callMethodInService(int money) {if(money>50) {methodInService();} else {System.out.println("錢不夠,不給干活。。。。");}}} }
package com.example.service;import android.app.Activity; import android.content.ComponentName; import android.content.Intent; import android.content.ServiceConnection; import android.os.Bundle; import android.os.IBinder; import android.view.View;public class MainActivity extends Activity {private IAgency agency;private MyConn conn;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}//4、以bind的方式開啟服務public void bind(View view) {Intent intent = new Intent(this,MyService.class);conn = new MyConn();bindService(intent, conn, BIND_AUTO_CREATE);}public void unbind(View view) {unbindService(conn);}//5、通過中介來調用方法public void call(View view) {agency.callMethodInService(55);}@Overrideprotected void onDestroy() {System.out.println("Activity 被銷毀");super.onDestroy();}//3、通過實現(xiàn)ServiceConnection來獲得中介對象private class MyConn implements ServiceConnection {@Override//當服務連接的時候或者被成功綁定的時候調用public void onServiceConnected(ComponentName name, IBinder service) {System.out.println("在Activity中成功得到了中間人。。。");agency = (IAgency) service;}@Override//當服務失去連接的時候調用,(一般進程掛了,服務被異常終止)public void onServiceDisconnected(ComponentName name) {}} } 還有一個地方需要注意:就是在服務被解除的時候,將調用onDestory方法,Service被銷毀,但是Service中的內部類也就是中介并沒有被銷毀,所以一般在調用unbindService方法之后,一般會將中介對象置為null。 最后附上Android api中的service生命周期圖:
?
轉載于:https://www.cnblogs.com/jasongaoh/p/7834242.html
總結
以上是生活随笔為你收集整理的android学习之Service的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 循环数组队列
- 下一篇: ios app的真机调试与发布配置