Serviceを使用する際に気を付ける点として
1.負荷率によってOS側から落とされる可能性
2.端末の再起動によって落ちる事
3.アプリのアップデートで落ちる事
以上の三点の対応を行いました。
※AndroidManifest.xmlへのServiceの追加は済んでいるものとします。
—— OS側から落とされる場合の対処 ——
これは簡単で、Service.Commandメソッドの戻り値を変更するだけで解決します。
戻り値に指定する値は以下。
・START_STICKY
・START_REDELIVER_INTENT
@Override public int onStartCommand(Intent intent, int flags, int startId) { return START_REDELIVER_INTENT; }
また、以下を指定すると再起動してくれません。
・START_NOT_STICKY
・START_STICKY_COMPATIBILITY
—— 端末の再起動時に起動 ——
後述する「アプリのアップデート時に起動」もですが
この二つはAndroidManifest.xmlにもソースを追加する必要があります。
※ファイル名は各自合わせてください
●AndroidManifest.xmlへ追加する
uses-permissionに”android.permission.RECEIVE_BOOT_COMPLETED”を追加してあげないと
起動通知を受け取れないみたいなので必ず記述してください。
●再起動時の起動通知を受け取るクラスを作成
public class BootReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) { // 起動するサービスを指定 Intent intent_service = new Intent(context, jp.program.sf.sample.heckelcheck.refreshService.class); context.startService(intent_service); } } }
—— アプリのアップデート時に起動 ——
自動更新で更新がかかった後に自動起動してるものがあったので
どうやってるのかなぁと気になってたのですが
これだけでできるのですね・・・
※ファイル名は各自合わせてください
●AndroidManifest.xmlに以下の内容を追加
●アップデート通知を受け取る受け取るクラスを作成
public class PackageUpdateReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(Intent.ACTION_PACKAGE_REPLACED)) { Intent intent = new Intent(context, MainService.class); context.startService(intent); } } }
今回クラスを二つに分けましたが、見た感じ一つのクラスにすることも可能なのかなぁって思いました。(実装してないので未確認です)
AndroidManifest.xml次第では無理なのかな・・・
今度やってみます(*・ω・)