Android Service於開機時自動執行

Android目前最普遍使用的app,莫過於通訊軟體,這類的通訊軟體,都需要在系統啟動時自動開啟,但也並非只有通訊軟體會有這項需求。
這項需求其實非常簡單,因為Android系統在很多時機都會發出廣播(Broadcast),每個廣播會有不同的行為(Action),只要接收開機完成的廣播,便可以在系統啟動完成時開啟我們自己寫的Service,步驟如下:

  1. AndroidManifest.xml
    • 由於BOOT_COMPLETED的廣播比較特別一點,只有系統可以發出,所以需要加上一項授權如下:
      <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
      
    • 接下來加上接收廣播的接收者(receiver)在<application>中
      <receiver android:name=".BootUpReceiver">
          <intent-filter>
              <action android:name="android.intent.action.BOOT_COMPLETED" />
          </intent-filter>
      </receiver>
      

      IntentFilter定義了此接收者可接收的行為。

    • 再來就是我們要開啟的目的Service
      <service android:name=".BootUpService" />
      
  2. BootUpReceiver.java
    新建一個class繼承自BroadcastReceiver如下

    package com.ks.bootup;
    
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    
    public class BootUpReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            /* 同一個接收者可以收多個不同行為的廣播
               所以可以判斷收進來的行為為何,再做不同的動作 */
            if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) {
                /* 收到廣播後開啟目的Service */
                Intent startServiceIntent = new Intent(context, BootUpService.class);
                context.startService(startServiceIntent);
            }
        }
    }
    
  3. BootUpService.java
    最後的目的就是這個Service了!
    將Service的內容寫在onStartCommand()中,此範例為每十秒印出一條Log。

    package com.ks.bootup;
    
    import android.app.Service;
    import android.content.Intent;
    import android.os.IBinder;
    import android.util.Log;
    
    public class BootUpService extends Service {
        private final String TAG = "BootUpService";
        private boolean running = false;
    
        @Override
        public IBinder onBind(Intent intent) {
            return null;
        }
    
        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
            running = true;
    
            new Thread() {
                @Override
                public void run() {
                    super.run();
    
                    while (running) {
                        Log.i(TAG, "Service running!!");
                        try {
                            sleep(10000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    Log.i(TAG, "Service stop!!");
                }
            }.start();
    
            return super.onStartCommand(intent, flags, startId);
        }
    
        @Override
        public void onDestroy() {
            super.onDestroy();
            running = false;
        }
    }
    

自啟動的Service可以依照需求,掌握每個裝置的動態,例如定位、網路狀態、發送和接收任何訊息等等…
應用非常廣泛,但Service在背景啟動消耗裝置的資源以及電量是一定的,如果Service並不需要在背景常駐,只要在Service中呼叫函式

stopSelf();

就可以將該Service關閉,節省不必要的資源消耗。

廣告

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s