6

ユーザーの位置を追跡するサービスがあります。現在、サービスはアプリケーションの起動時に起動し、アプリケーションの終了時に停止します。残念ながら、ユーザーがアプリケーションをバックグラウンドで保持している場合、サービスが停止することはなく、バッテリーが消耗します。

アプリケーションがフォアグラウンドにないときにサービスを停止したいと考えています。Application クラスで onPause および onResume ハンドラをオーバーライドできるようになることを期待していましたが、それらがありません。これを達成できる別の方法はありますか?

4

8 に答える 8

5

これはまだテストしていませんが、Context#bindService()( の代わりにContext#startService()) を使用すると、バインドされているアクティビティがなくなるとサービスが停止するようです。(サービスのライフサイクルを参照)。

次に、各アクティビティでonPause()/を使用onResume()して、サービスにバインド/バインド解除します。

または、サービスにメソッドのペアを追加して、位置情報の更新のリッスンを開始/停止し、各アクティビティのonResume()/から呼び出すように指示することもできますonPause()。サービスは引き続き実行されますが、位置情報の更新によってバッテリーが消耗することはありません。

于 2010-12-04T05:26:46.387 に答える
1

上記のすべての回答を読むことをお勧めします各アクティビティにブール値のグローバルフラグを追加し、それを onResume と onPause に追加し、アクティビティの起動中にもこのようなものを作成します

public void onPause()
{
super.onPause();
activity1IsResumed = true;
}

&onResumeも同じ

& 同様に、新しいアクティビティを起動するとき

startActivityForResult(myintent ,0);
activity2IsResumed = true;
activity1IsResumed = false;

次に、サービスでチェックするだけです

if(activity1IsResumed || activity2IsResumed || activity3IsResumed)
{
//your logic
}
else
{
//another logic
//or dont run location tracker
}

&あなたは完了です!

于 2010-12-08T10:18:03.773 に答える
0

私が提案するのは、他の人が言ったように onPause/onReume メソッドをオーバーライドすることです。アプリケーションの流れとアクティビティ間の相互作用について詳しく知らなければ、当て推量以上の情報を提供することはできません。

ただし、アクティビティが永続的である場合は、アクティビティを切り替えるときにインテントをより適切に利用することをお勧めします。

たとえば、各アクティビティにはブール値の「遷移」フラグが必要です。したがって、あるアクティビティから次のアクティビティに移動するときは、インテント エクストラを設定します。

intent.putExtra("transition",true);

受信アクティビティで次の操作を行います: (onCreate 内)

intent.getBooleanExtra("transition",false);

このようにして、起動するアクティビティごとに、それが別のアクティビティからのものなのか、それともホーム画面のランチャーから起動されたものなのかを知ることができます。したがって、true トランジションを取得した場合、onPause はサービスを停止してはなりません。つまり、返された後に前のアクティビティに戻ることになります。「トランジション」エクストラを受信しない場合、または誤ったトランジションを受信する場合は、現在のアクティビティを引き継ぐのを待っているアクティビティがその下にないと安全に想定できます。

最初のアクティビティでは、別のアクティビティに切り替える場合は、単にサービスを停止する必要があります。これは、あるアクティビティが別のアクティビティから開始されているかどうかをプログラムで把握できるはずです。

于 2010-12-09T19:33:44.853 に答える
0

ActivityのonPauseおよびonResumeメソッドをオーバーライドする必要があります。複数のアクティビティがある場合は、それらに共通の基本クラスを用意し、開始/停止ロジックを基本クラスに配置することができます。

于 2010-10-28T17:31:05.927 に答える
0

私はこのアプローチを試したことはありませんが、Android デバイスのホーム キーをオーバーライドしKeyEvent.KEYCODE_HOMEstopService(Intent)サービスを停止し、アプリケーションが再び再開したときにstartService(Intent)アクティビティの onResume() メソッドに書き込むことができると思います。

このようにして、ユーザーが明示的にホームボタンを押してバックグラウンドでアプリケーションを取得したときにのみサービスが停止し、あるアクティビティから別のアクティビティに切り替えたときではないと思います。

于 2010-12-04T07:06:49.317 に答える
0

本当の問題は、自分のものではないアクティビティに行ったときにのみサービスを停止する方法にあるようです? 1 つの方法は、onPause メソッドでアクティビティを停止することです。すべてのアクティビティでこれを行います。次に、startActivity メソッドをオーバーライドします。そして、ここで条件付きテストを実行して、意図的に独自の 1 つに移動していることを確認します。フラグが true に設定されている場合。

一時停止中のオーバーライドされたメソッドに戻ります。フラグが true でない場合にのみ、サービスを停止します。フラグを false に設定します。

離れて移動するすべてのイベントは、サービスを閉じます。自分自身に移動しても、そのまま残ります。

すべてのアクティビティが拡張される基本クラスでオーバーライドを行います。

私のアンドロイドに書いた。後でエザプルを投稿します。

于 2010-12-10T21:48:07.310 に答える
-1

メソッドregisterActivity()unRegisterActivity()Application オブジェクトを作成し、すべての行為で最初のメソッドを実装し、行為onResume()で 2 番目のメソッドを実装しますonPause()

最初のメソッドList<Activity>は、アプリ オブジェクトのインスタンスにアクティビティを追加unRegisterActivity()し、すべての呼び出しでリストのサイズをチェックしますif==0 stopService();

于 2010-12-07T03:29:53.897 に答える