4

私は現在、電話をかけたり受けたりするためのすべての SIP シグナリングを処理するサービスを含む Android テレフォニー アプリケーションを開発しています。

ユーザーがアプリケーションに正しくログインした場合にのみ、このサービスを開始したいと考えています。ただし、望ましくない動作が見られます。アプリの実行中にデバイスがシャットダウンされると、電話の起動後にサービスが自動的に開始されます。電話をシャットダウンするときにアプリケーションが閉じられている場合、これは発生しません。

私はそれについて読んでいますが、答えはありません。なぜこれが起こるのか、それを防ぐ方法を誰か説明できますか?

前もって感謝します。

4

1 に答える 1

1

CommonsWare のコメントのおかげで、すぐに答えが見つかりました。

[...] サービスが開始される唯一の方法は、誰かがサービスを開始した場合であり、OS はそれを単独で実行しません。

私はOSがそれを担当していると思っていたので、アプリの以前のバージョンから継承された文書化されていない機能として、故意に行われていることに気付かなかった.

android.intent.action.BOOT_COMPLETED アクションをリッスンする BroadcastReceiver がありました。このレシーバーは、とりわけ、アプリが適切にシャットダウンされていないときに、起動時にサービスを再起動していました。

CommonsWare のご協力に感謝します。


アップデート

BroadcastReceiver が BOOT_COMPLETE アクションをリッスンしないようにした後も、同じ動作が発生します。

その理由は、アプリが実行されている場合にのみ、WIFI またはデータ接続がアクティブになったときに、この BroadcastReceiver も接続の変更をリッスンして SIP サービスを再起動するためです。アプリケーションが閉じられたかどうかはアプリの設定に保存されますが、アプリの実行中に電話がシャットダウンされたときに、この値が正しく設定されませんでした。

そのため、起動時にサービスが不要に開始されていました。BroadcastReceiver が起動時に android.net.conn.CONNECTIVITY_CHANGE を検出し、アプリがまだ実行されているか終了したかを示す設定が適切に更新されなかったためです。

于 2013-09-17T13:47:25.287 に答える