web-dev-qa-db-ja.com

アプリケーションの破棄時にサービスを停止する

私は今、実行と停止のサービス概念について混乱しています:

私がやりたいこと:

  • アプリケーションの最初に位置情報サービスを開始します。

  • ロケーションの更新を取得し続け、storeそれらを共有設定に

  • onDestroy of Application scope!でサービスを停止します

これまでのところ、私はサービスで以下のことしかできません(間違っている場合は修正してください):

  • 関連するactivity/fragments/viewsにサービスをバインドすることでサービスを自動的に停止します。すべてのサービスが自動的にバインドを解除し、unbindでstopselfメソッドを呼び出すことができます

  • onStartCommandでSTART_NOT_STICKYを返し、OSに通知し、再作成せず、意図的なローカルサービスを作成します。何らかの作業が完了すると、それ自体が破壊されます。

  • 何らかの静的なスコープで意図を宣言し、ApplicationクラスのonActivityDestroyedでサービスを停止することにより、サービスを手動で停止します[どうなるかわかりませんか? 、アクティビティが破棄されるたびにサービスが破棄される可能性がありますか?または、アプリケーション全体が破壊された場合にのみ破壊されますか?]

いずれにせよ、私は少し混乱し、打ち負かされ、私のLocation service 2日間の詳細情報

9
Zulqurnain Jutt

まず、アプリの起動時に「LocationService」を起動します。

_public class MyApp extends Application {

    private static final String TAG = "MyApp";

    @Override
    public void onCreate() {
        super.onCreate();
        Log.d(TAG, "App started up");
        startService(new Intent(this, MyLocationService.class));
    }
}
_

2番目:あなたが言ったように、サービスは "START_NOT_STICKY"フラグを使って実行する方が良いでしょう

_@Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        return START_NOT_STICKY;
    }
_

トリド:

システムがアプリを強制終了すると、サービスは自動的に強制終了されるため、まったく問題はありません。

ApplicationオブジェクトにはonDestroy()メソッドはありません。同様のイベントはonTerminated()のみであり、実稼働デバイスでは起動されません。

onTerminate

APIレベル1で追加void onTerminate()このメソッドは、エミュレートされたプロセス環境で使用するためのものです。プロダクションAndroidデバイスでは、単にプロセスを強制終了するだけでプロセスが削除されるため、コールバックを含むユーザーコードは実行されません。

詳細: https://developer.Android.com/reference/Android/app/Application.html#onTerminate()

ところで、MyLocationServiceがアプリの場所の更新を(アプリが開いているとき)に送信するようにしたい場合は、OttoまたはEventBusを使用することを検討する必要があります(使いやすいため、この最後のものをお勧めします)。必要に応じて、取得した古い場所の更新を受信するように@Suscriberを構成することもできます。

3
zapotec

START_NOT_STICKYを使用してサービスを開始する場合、アプリケーション全体がバックグラウンドから閉じられると、つまり、ホーム画面からアプリをクリーンアップすると、アプリはサービスを強制終了します。

ここでSTART_NOT_STICKYは、サービスが強制終了された場合に再作成する必要がないことを示しています。

そうでない場合は、自分で手動で削除する必要があります。

お気に入り

Intent lintent = new Intent(context, LocationService.class);
context.stopService(lintent);

このコードは、アプリケーションが強制終了するポイントで使用できます。

それでおしまい。これでいいです。

4
AndroidHacker

最も簡単な方法は、まず、AlertManagerでIntentServiceを一定の時間(10分)で開始し、次にonHandleIntent()で場所を取得して設定に保存します。

アクティビティにバインドする必要はありません。IntentServiceは設定に保存された後、自動的に停止します。

0
pavan kvch

私は最も簡単な方法で説明しようとします:) 2種類のサービスがありますIntentServiceServiceIntentService内容はonHandleIntentメソッドServiceのように、アクティビティのコンテキストを使用して開始してもコマンドを実行するまで終了しません。また、極端な場合にアプリケーションが停止されると停止します(システムごと(Settings/application/YourApp/stop app ORアプリのクラッシュ))

0
thunder413