1

これまでのところ、単純なローカル サービスのクラスができました。私がやりたいことは、アプリケーションのさまざまなアクティビティからこのローカル サービスにリクエストを送信することです。これらのリクエストのパラメーターに応じて、サービスは HttpClient 経由で Web サーバーに接続し、JSONObject を受け取り、それをアクティビティに返します。すべての HTTP 通信は既にアクティビティ内で機能していますが、ローカル サービスの別のスレッドで実行したいと考えています。

これまでのところ、私の非常に単純なローカル サービスのソース コードは次のようになります。

// BackgroundService.java
package com.test.localservice;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;
public class BackgroundService extends Service
{
    @Override
    public void onCreate() {
        super.onCreate();
        Log.i("BackgroundService", "onCreate()");
        Thread thr = new Thread(null, new RunThread(), "BackgroundService");
        thr.start();
    }
    class RunThread implements Runnable
    {
        public void run() {
            Log.i("BackgroundService", "run()");

            /* Here the HTTP JSON communication is going to happen */

            //BackgroundService.this.stopSelf();
        }
    }
    @Override
    public void onDestroy()
    {
        Log.i("BackgroundService", "onDestroy()");
        super.onDestroy();
    }

    @Override
    public void onStart(Intent intent, int startId) {
        Log.i("BackgroundService", "onStart()");
        super.onStart(intent, startId);
    }
    @Override
    public IBinder onBind(Intent intent) {
        Log.i("BackgroundService", "onBind()");
        return null;
    }

}

私が現在直面している問題 (知識不足のため) は、通信部分のActivity <--> Local Serviceです。AIDL (Android Interface Definition Language)を使用したリモート サービスの通信とオブジェクト交換の例をいくつか見つけました。しかし、この道を行かなければならないかどうかはわかりません。自分で定義したオブジェクトを交換するか、それが不可能な場合は JSONObject を交換するか、単純な文字列配列だけでも機能する場合は (今のところ) 単純に交換したいと思います。

誰かが私を正しい方向に向けてください。可能であれば、ローカル サービスとのオブジェクト交換 (双方向) の簡単な例を挙げてください。

前もって感謝します。

4

1 に答える 1

5

AsyncTaskこのシナリオでは、独自のスレッドの代わりに を使用することをお勧めします。

アクティビティにオブジェクトへの参照を与えるにはBackgroundService、次のオプションがあります。

  1. シングルトンを使用します (つまり、BackgroundServiceパブリック静的データ メンバーなどの静的コンテキストからオブジェクトを使用できるようにして、その静的参照を無効にしますonDestroy())。

  2. LocalServiceBindingAPI サンプルに従って、IBinder単にオブジェクトへのアクセスを許可するを返しBackgroundServiceます。

そこから、すべてが同じ JVM 内にあるため、オブジェクトを渡すだけで済みます。ただし、コンポーネントの有効期間を過ぎたものを保持しないように注意してください (たとえば、Activityシングルトンをキャッシュしないでください)。

于 2009-10-09T12:10:07.610 に答える