1

わかりましたので、私が書いたアプリケーションにはサービス (GPS データを追跡する) があり、メソッド内で bindService を使用してバインドし、メソッドを使用onStart()してサービスからバインドを解除する単一のメイン アクティビティがあります。 onStop()unbindService(ServiceConnection)

メインアクティビティのボタンを押すと起動するオプション画面のアクティビティもあります。このオプション画面には、「バックグラウンドで実行」というチェックボックスがあります。これが true に設定されている場合、ユーザーが [ホーム] または [戻る] ボタンのいずれかでアプリケーションを終了すると、サービスは GPS をオンにせずに実行を継続します。オフ。

これを行うには、設定が true に設定されている場合は と を呼び出しthis.startForeground onUnbind、設定が false の場合はロケーション リーダーをthis.stopForeground onRebind停止および開始します。onUnbindonRebind

サービスがバックグラウンドで実行されている場合は、通知も表示され、GPS がまだ実行中であり、電力を消費していることをユーザーが理解できるようにします。startForegroundこの通知は、およびstopForegroundメソッドに依存して表示および停止されます。

問題は、この設定が true であるかどうかに関係なく、オプション画面を表示している場合は、サービスを続行したいのですが、その通知を表示したくないという事実にあります。したがって、ボタンを押してオプション画面に移動した場合に true に設定されたフラグを設定し、フラグが true の場合は unbindService を呼び出さないでください。

わずかな問題を除いて、これは機能します。ユーザーがオプション画面を表示しているときにホームボタンを押した場合、サービスは停止する必要がある場合は停止されず (メイン画面にバインドされているため)、実行を継続する必要がある場合は警告を表示しません。通知 (そしてもちろん、これはサービスがまだバックグラウンドにあると見なされることを意味します)。

このアプリケーションを希望どおりに動作させるにはどうすればよいですか?

4

1 に答える 1

1

さて、私はちょうどうまくいくように見える解決策を見つけました。アクティビティのonStart()メソッドでオプション画面をサービスにバインドし、onStop()で再度バインドを解除します。前のアクティビティのonStop()メソッドは、新しいアクティビティのonResume()メソッドが完了するまで呼び出されないため、機能します。

誰かがもっと良い方法がありますか?実際にアクセスする必要のないサービスにアクティビティをバインドするのはばかげているようです。

于 2010-11-12T02:24:44.940 に答える