Service
に開始してバインドするActivity
があります。私はその後、別のActivity
、最初から起動している。 2番目から最初のActivity
に戻ると、私はService
のメソッドを呼び出す必要があります(いくつかのデータを保存します)。画面の向きが変更された後、アクティビティに戻るときにAndroidサービスへの参照が失われる
各Activity
を表示している間に、私のActivity
ライフサイクルメソッドは、Activity
を終了する前に同じ画面方向に戻っていれば、画面の向きの変更に十分対応しているようです。
最初のアクティビティを出発時とは異なる向きに戻すと問題が発生します。その場合、私はService
への参照を失い、NullPointerException
のonActivityResult()
に入ります。したがって、第2のActivity
をポートレートモードで起動し、第2のActivity
を表示しながら横向きに切り替え、横向きモードで最初のActivity
に戻ると、クラッシュします。
どうしたらよいですか?私はマニフェストファイルを使用して構成の変更を処理することを示すことはしません - 私は主な問題に対処していないやや醜いハックとして私を襲う。
@Override
protected void onStart()
{
super.onStart();
// start and bind to service
startService(smsIntent);
connection = new SMServiceConnection();
bindService(smsIntent, connection, Context.BIND_AUTO_CREATE);
}
@Override
protected void onRestart()
{
super.onRestart();
}
@Override
protected void onResume()
{
super.onResume();
}
@Override
protected void onPause()
{
super.onPause();
sms.save(); // autosave
}
@Override
protected void onStop()
{
super.onStop();
unbindService(connection);
// stopService(smsIntent); //doesn't appear to have any effect
}
@Override
protected void onDestroy()
{
super.onDestroy();
}
EDIT:私は再び何かが欠けていない限り...ここ
は、最初の活動から、私のライフサイクルメソッドからの抽出物である。ここ民間の内部クラスの中で私のSMServiceConnectionクラスからの抽出物があります私のアクティビティは、カスタムServiceConnectionクラスから継承されています。
@Override
public void onServiceConnected(ComponentName name, IBinder service)
{
super.onServiceConnected(name, service);
msg("Service connected");
sms = getSMService();
if (sms != null)
{
String s = sms.getStuff(); //etc.; haven't listed every method invoked on sms
sms.saveSurvey();
}
} else
{
System.out.println("sms is null!");
}
}
@Override
public void onServiceDisconnected(ComponentName name)
{
super.onServiceDisconnected(name);
msg("Service disconnected");
}
マイServiceConnectionスーパークラスのようなものである:あなたの問題は、onActivityResult()がONSTARTにbindcall後わずかたまたま、以前あなたが戻ったときに再バインドされているサービスに呼ばれていることかもしれません
public class MyServiceConnection implements ServiceConnection
{
private boolean serviceAvailable = false;
private SMService sms;
public void onServiceConnected(ComponentName name, IBinder service)
{
serviceAvailable = true;
LocalBinder b = (LocalBinder) service;
sms = b.getService();
}
public void onServiceDisconnected(ComponentName name)
{
serviceAvailable = false;
}
public boolean isServiceAvailable()
{
return serviceAvailable;
}
public SMService getSMService()
{
return sms;
}
}
SMServiceConntectionのコードを投稿してください。バインディングを保存するonServiceConnected()メソッドがあります。私はServiceConnectionに内部クラスを使用します。この方法でServiceConnectionはバインダーをアクティビティ(格納するクラス)に保存できます。 – Stefan
OK、コードを追加しました。 – Spinner