ユーザーの操作でそれ自体のインスタンスをさらに起動するアクティビティがあります。このアクティビティは、Bluetooth 接続を維持するサービスにバインドします。現在、これは次のように実現されています。
@Override
public void onResume()
{
super.onResume();
//bind the activity to the service when it is not bound yet.
if (!this.isBound)
{
//Application context, because the Connection shall be kept over configuration change, and the activity will be replaced then.
Intent serviceIntent = new Intent(this.getApplicationContext(), ConnectionService.class);
bindService(serviceIntent, this.connection, Context.BIND_AUTO_CREATE);
this.isBound = true;
}
else
{
this.connection = (ServiceConnection)getLastNonConfigurationInstance();
}
this.visible = true;
}
/**
* Saves the bound state.
*/
@Override
public void onSaveInstanceState(Bundle outState)
{
outState.putBoolean("isBound", this.isBound);
}
/**
* Loads the bound state.
*/
@Override
public void onRestoreInstanceState(Bundle inState)
{
this.isBound = inState.getBoolean("isBound");
}
/**
* Called by system, gives the current ServiceConnection to the system to be retrieved again after restart.
*/
@Override
public Object onRetainNonConfigurationInstance() {
return this.connection;
}
@Override
public void onPause()
{
//unbind the activity to the service when it is finishing.
super.onPause();
this.visible = false;
if (this.isFinishing() && this.isBound)
{
unbindService(this.connection);
this.isBound = false;
}
}
今私の問題は次のとおりです。アプリの実行中に向きを変更すると、戻るボタンを押すまですべて問題ありません。それで
07-05 12:07:03.039: E/ActivityThread(17850): Activity mm.android.prototype.uilayer.DatapointActivity has leaked ServiceConnection mm.android.prototype.uilayer.DatapointActivity$1@408bcbb8 that was originally bound here
07-05 12:07:03.039: E/ActivityThread(17850): android.app.ServiceConnectionLeaked: Activity mm.android.prototype.uilayer.DatapointActivity has leaked ServiceConnection mm.android.prototype.uilayer.DatapointActivity$1@408bcbb8 that was originally bound here
とログに書かれており、unbind コマンドの onPause() メソッドでアプリがクラッシュします。Google フォーラムで Dianne Hackborn の投稿を読んだことがありますが、ServiceConnection に頼ることはできませんが、それに対処する方法が見つかりませんでした。このエラーを解消したり、アプリがこのように動作する理由を説明したりできますか?