2

アクティビティからサービスを開始したい。

まず、LocalBinder で試してみました。これは機能しますが、サービスはアクティビティにバインドされています。アクティビティがなくなったときにサービスを停止したくありません。LocalBinder で解決策が見つからなかったので、削除してこれを試しました:

サービスでシングルトン インスタンスを使用し、新しいスレッドで startService メソッドを呼び出し、インスタンスが使用可能になるまで待機します。

final Intent recordService = new Intent(RecordActivity.this, RecordService.class);
    Runnable r = new Runnable() {
        @Override
        public void run() {
            startService(recordService);
        }
    };
    new Thread(r).start();

    Log.i(MMLF.T, "service instance: "+serviceInstance);
    final ProgressDialog mProgressDialog = ProgressDialog.show(
            RecordActivity.this, "Waiting", "wait until record service is loaded",
            true);
    while (serviceInstance == null) {
        serviceInstance = RecordService.get();
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            Log.e(MMLF.T, "could not sleep", e);
        }
    }
    mProgressDialog.dismiss();

しかし、これもうまくいきません。待機ループに陥りました。この待機中のものを削除し、新しいnew Thread(r).start()行が最後になると、アクティビティとサービスが正常に開始されます。

アクティビティから独立したサービスを開始するには? 私はまた、彼らがお互いに通信できるようにしました。アクティビティは 2 つのメソッド (記録の開始と停止) を呼び出し、サービスはメッセージを送信する必要があります。2 つ目は、LocalBroadcast を使用できます。

4

1 に答える 1

0

サービスはすでにアクティビティとは独立して存在しているため、あなたの質問は少し混乱しています。ただし、サービスはデフォルトでメイン スレッドで実行されることに注意してください。Service を別のスレッドで実行したい場合 (この場合は実行しているように見えます)、Messenger オブジェクトを設定し、ワーカー スレッドと UI スレッドの間でメッセージを送信する必要があります。また、AIDL の使用を検討することもできます (その上に Messenger が実際に構築されています)。メッセンジャーを使用しない場合、コミュニケーションでインテントを使用できます。この場合は、IntentServiceを調べる必要があります。ただし、これはサービスにメッセージを送信している場合にのみ機能し、前後には機能しません. やり取りが必要な場合は、ある種のメッセンジャーまたは類似のパターンを使用する必要があります。

ちなみに、'stop' や 'start' などに IntentService を使用することはかなり一般的です。通常、バックグラウンド スレッドもあり、Messenger などを使用してサービスと通信し、メッセージを送受信して、何をすべきかをワーカー スレッドに指示します。

AsyncTask を検討することもできます。これにより、この種の作業がはるかに簡単になります。

于 2012-06-05T01:06:24.077 に答える