Androidアプリ開発で、端末スリープ時や他のアプリ起動中も動き続けるサービスを作るための方法です。サービスを起動しても、しばらくすると勝手に終了してしまうことがあると思いますが、その時の対策です。

onStartCommandの戻り値をSTART_STICKYかSTART_REDELIVER_INTENTにする

サービスのメソッドであるonStartCommandの戻り値を「START_STICKY」または「START_REDELIVER_INTENT」にすると、サービスが停止しても再起動が行われます。

「START_STICKY」と「START_REDELIVER_INTENT」の違いは再起動時に終了前のintentが保持されるかどうかの違いのようです。「START_REDELIVER_INTENT」の場合は終了前のintentが保持されていてonStartCommandに再度渡されます。

startForegroundを使用する

サービスの中で、startForegroundメソッドを使用して通知バーを表示すると、メモリ不足時等の強制終了対象にほぼならなくなります。

よく通知バーに常駐表示しているアプリ(050plusなど)があると思いますが、それと同じ仕組みかと思います。

これをしないと、メモリが不足してきたときにサービスが勝手に落とされたりします。

NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
builder.setContentTitle(getText(R.string.xxx));
builder.setSmallIcon(R.drawable.xxx);
builder.setContentText(getText(R.string.xxx));
startForeground(NOTIFICATION_ID, builder.build());