Service.startForeground()とNotificationManager.notify()

image

Androidネタ続きですんません。サービスとしてバックグラウンドで動作しているものは、まあ、勝手に死んで欲しくないから動かしているわけですが、普通に、startService()で動かしたものだと、メモリが逼迫したりすると、簡単に殺されてしまいます。まあ、だから、新しくアプリケーションが動き出すことができるわけですが。

それでも殺して欲しくないサービスというのはあるもので、そういうもののために、Service.startForeground()というAPIが用意されています。これを使うと、サービスなんだけれど、Foregroundで動いている扱いになり、簡単には殺されなくなってくれます。

そういった「サービス」が動作中であると言うことを示すために、通知バーに、動作中であることを示す通知を作らなければならないという制約こそありますが。

もともと、startForeground()を使わなくても、NotificationManagerを使って、通知は出していたので、これを、NotificationManager.notify()に渡すのではなく、Service.startForeground()に渡すようにするだけで、サービスをForeground化できる……はずだったのですが、そうは問屋が卸しませんでした。

NotificationManager.notify()も、Service.startForeground()も、引数は同じ、(int id, Notification n)になります。どちらも、通知バーに表示される通知を管理する、アプリケーション内でユニークなキーと、通知そのものになります。

元々、notificationManager.notify(0, notification)のように、id == 0で使っていたので、そのまま、startForeground(0, notification)のように置き換えました。

が、これがダメでした。要するに、id==0だと、startForeground()は機能しないのです。リファレンスにはそんなことは書いてなかったし、NotificationManager.notify()の方は問題なく機能するのですが……。

とにもかくにも、id == 0だけは、ダメだというお話。