iT邦幫忙

2022 iThome 鐵人賽

DAY 15
0

Service是一個我覺得很特別且在寫Android的路上將會有很多機會出場的一個重要工具,尤其是當app的規模越大的時候,一定會考慮讓他出場。

簡介

Service可以說是 Android 中一種獨特的 Thread,是一個在背景執行的服務。主要用於某些特定功能在APP離開前景後仍需要執行時,這時候就輪到Service上場拉~!!

使用方法及觀念講解

由於Service的使用取決於功能和程式設計師的想法,所以我今天就以怎麼使用和讓各位知道和如何運作為主。

範例

Service

  1. 建立Service

    建立一個class繼承類別Service,裡面包含Service的生命週期和想在背景執行的方法。

public class MyService extends Service {
    private final String TAG = "Service";
    public class MyBinder extends Binder //宣告一個繼承 Binder 的類別 LocalBinder
    {
        MyService getService()
        {
            return  MyService.this;
        }
    }

    public void test(){
        Log.e(TAG, "Service 測試方法");
    }

    private MyBinder myBinder = new MyBinder();

    @Override
    public void onCreate()
    {
        super.onCreate();
        Log.e(TAG, "Service Create" );
    }



    @Override
    public int onStartCommand(Intent intent, int flags, int startId)
    {
        // TODO Auto-generated method stub
        Log.e("onStartCommand", "Service onStartCommand" );
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public boolean onUnbind(Intent intent)
    {
        Log.e(TAG, "Service Unbind" );
        return super.onUnbind(intent);
    }

    @Override
    public void onDestroy()
    {
        super.onDestroy();
        Log.e(TAG, "Service Destroy" );
    }
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        Log.e(TAG, "Service Bind" );
        return myBinder;
    }
}
  1. 新增標籤service至AndroidManifest.xml

    與activity標籤概念相同,沒新增就無法使用喔!!

<service android:name=".MyService" android:enabled="true" />

啟動和暫停

我設計了五個按鈕分別對應到Service的五個不同情況。

  1. startService()

    啟動Service。

 startService_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(mContext, MyService.class);
                //開始Service,進入生命週期onCreate、onStartCommand
                startService(intent);
            }
        });

呼叫startService(Intent)啟動Service,此時會進入Service的生命週期onCreate()和onStartCommand(),沒有啟動Service就不會開始在背景執行喔,**onStartCommand()**是startService()才會進的的關鍵生命週期喔!

  1. stopService()

    停止Service。

stopService_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(mContext, MyService.class);
                //停止Service,進入生命週期onDestroy
                stopService(intent);
            }
        });

呼叫stopService(Intent)停止Service,此時會進入Service的生命週期onDestroy(),把Service銷毀。

綁定與解綁


ServiceConnection

負責接收Service生命週期中的onUnbind()和onBind()的回調,也是Service和Activity溝通的橋樑。

public ServiceConnection serviceConnection = new ServiceConnection() {
        //IBinder 由Service中onBind直接回傳
        public void onServiceConnected(ComponentName className, IBinder binder) {
            Log.e("onServiceConnected", "Service連線" );
            myService = ((MyService.MyBinder) binder).getService();
        }

        public void onServiceDisconnected(ComponentName className) {
            Log.e("onServiceConnected", "Service斷線" );
            myService = null;
        }
    };
  1. bindService()

    與Service綁定。

 bindService_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(mContext, MyService.class);
                //綁定才能呼叫Service的Function,進入生命週期onCreate、onBind
                bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE);
            }
        });

呼叫bindService(Intent,ServiceConnection,Context)與Service綁定,此時會進入Service的生命週期onCreate()、onBind(),完成綁定後才能獲取Service物件,也才能使用Service中的Function,**onBind()**是bindService()才會進的的關鍵生命週期喔!

  1. unbindService()

    與Service解除綁定。

unBindService_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //解除Service綁定,進入生命週期onUnbind、onDestroy
                unbindService(serviceConnection);
            }
        });

呼叫unbindService(ServiceConnection)與Service解除綁定,此時會進入Service的生命週期onUnbind()、onDestroy(),**onUnbind()**是unbindService()才會進的的關鍵生命週期喔!

注意: 從上面看起來onCreate()和onDestroy()會重複的進入,但事實並非如此,比如我呼叫startService()接者呼叫bindService(),Service中的onCreate()是只會進一次的,onDestroy()亦同。

  1. 呼叫Service方法
serviceFunction_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //呼叫Service 方法
                myService.test();
            }
        });

最後,使用Service中的方法就可以使用Service物件呼叫在Service中的方法即可囉~

經過以上操作可以去開發人員選項->正在運作的服務中確認Service是否正在運作喔。如下
https://ithelp.ithome.com.tw/upload/images/20220807/20139136DZZXIEQ0Pj.jpg

有這樣的畫面就代表啟用成功了喔~而如果使用stopService()的話,正在運作的服務中的app就會消失了喔。


上一篇
精華筆記 Day14 -- Thread
下一篇
精華筆記 Day16-- BroadCast
系列文
android studio 30天 精華筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言