5

バックグラウンドで実行されるネットワーク サービスがあります。mConnectionアクティビティ内にこのグローバル変数があります

protected ServiceConnection mConnection = new ServiceConnection() {

    public void onServiceConnected(ComponentName className, IBinder binder) {
        serviceobject = ((NetworkService.MyBinder) binder).getService();
    }

    public void onServiceDisconnected(ComponentName className) {
        serviceobject = null;
    }
};

次に、アクティビティのonCreate(..)使用でサービスをバインドします

bindService(new Intent(this, NetworkService.class), 
                 mConnection,Context.BIND_AUTO_CREATE);

NetworkService クラスには内部クラス MyBinder があります

public class MyBinder extends Binder {
    NetworkService getService() {
        return NetworkService.this;
    }
}

アクティビティから Service メソッドを呼び出すには、を使用serviceobjectし、for each メソッド呼び出しを作成しAsyncTaskます (Activity から Service メソッドを呼び出すと、サービスの使用が無効になることがわかっています。これを、関与しないライト メソッドに使用します)。計算量が多い)

Serviceこれは、を使用してからのデータを直接処理するのに役立ちますserviceobjectActivityの Serviceのバインドを解除しますonDestroy()

@Override
protected void onDestroy()
{
    unbindService(mConnection);
    super.onDestroy();
}

これが最善の方法ですか、それともどこか間違っていますか?

4

1 に答える 1

1

あなたがやりたいことは、Remote Service. それが、ServiceConnectionそして慣れ親しんだものbindServiceです。アイデアは、サービスが baackground で実行され、任意のアクティビティがサービスに「バインド」され、AIDL で定義したインターフェイスを介して対話できるというものです。

サービスへのアクセスは高速であるため、 を使用せずに UI スレッドからサービスのメソッドを呼び出すことができますAsyncTask。それが1つのメリットです。

ただし、この AIDL インターフェースを作成する必要があるため、実装は少し面倒です。

ここで Google のチュートリアルを読むことをお勧めします: http://developer.android.com/guide/developing/tools/aidl.html

そして、「チュートリアル」または「例」で「リモート サービス AIDL」をググってください。

幸運を。

于 2012-05-20T18:55:56.923 に答える