4

呼び出してサービスをバインドした後:

bindService(new Intent(IBumpAPI.class.getName()), connection, Context.BIND_AUTO_CREATE);

デバッグ目的で onServiceDisconnected() を呼び出す必要があります。

サービスがクラッシュしたり強制終了されたりした場合など、サービスへの接続が予期せず失われた場合に Android システムがこれを呼び出し、クライアントがアンバインドした場合には呼び出されないことを認識しています。

だから私の質問は、テストを完了することができるように、いつでも onServiceDisconnected() を強制的に呼び出す方法ですか?

4

2 に答える 2

6

サービスを開始し、 Context.BIND_NOT_FOREGROUND フラグでバインドしてから停止する必要があります。これにより、onServiceDisconnected が呼び出されます。以下は、doBind メソッドと doUnbind メソッドを呼び出すためにリンクされた 2 つのボタンを含む MainActivity のコードです (TestService サービスが定義されていると仮定します)。

package com.example.servicetest;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.util.Log;
import android.view.Menu;
import android.view.View;

public class MainActivity extends Activity {
    private static final String TAG = "MainActivity";

    private ServiceConnection connection = new ServiceConnection() {

        @Override
        public void onServiceDisconnected(ComponentName name) {
            Log.d(TAG, "Service disconnected: " + name);
        }

        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            Log.d(TAG, "Service connected: " + name);
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }

    public void doBind(View v) {
        Intent i = new Intent(this, TestService.class);
        startService(i);
        bindService(i, connection, Context.BIND_NOT_FOREGROUND);
    }

    public void doUnbind(View v) {
        Intent i = new Intent(this, TestService.class);
        stopService(i);
    }

}

ボタンをクリックすると、このコードは次のログを提供します。

11-27 09:21:57.326: D/MainActivity(10724): Service connected: ComponentInfo{com.example.servicetest/com.example.servicetest.TestService}
11-27 09:21:58.099: D/MainActivity(10724): Service disconnected: ComponentInfo{com.example.servicetest/com.example.servicetest.TestService}
于 2012-11-27T08:30:28.700 に答える
1

サービスのバインドを解除するだけかもしれません

public void openService {
mConnection = new ServiceConnection() {
            @Override
            public void onServiceConnected(ComponentName name, IBinder service) {
                mService = IService.Stub.asInterface(service);
            }
            @Override
            public void onServiceDisconnected(ComponentName cn) {
                mService = null;
            }
        };
         bindService(service, mConnection, Context.BIND_AUTO_CREATE);   
    }
}

public void closeService() {
    unbindService(mConnection);
    stopService(new Intent(this, Service.class));
}
于 2012-11-27T08:31:04.523 に答える