4

Serviceに開始してバインドするActivityがあります。私はその後、別のActivity、最初から起動している。 2番目から最初のActivityに戻ると、私はServiceのメソッドを呼び出す必要があります(いくつかのデータを保存します)。画面の向きが変更された後、アクティビティに戻るときにAndroidサービスへの参照が失われる

Activityを表示している間に、私のActivityライフサイクルメソッドは、Activityを終了する前に同じ画面方向に戻っていれば、画面の向きの変更に十分対応しているようです。

最初のアクティビティを出発時とは異なる向きに戻すと問題が発生します。その場合、私はServiceへの参照を失い、NullPointerExceptiononActivityResult()に入ります。したがって、第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; 
    } 


    } 
+0

SMServiceConntectionのコードを投稿してください。バインディングを保存するonServiceConnected()メソッドがあります。私はServiceConnectionに内部クラスを使用します。この方法でServiceConnectionはバインダーをアクティビティ(格納するクラス)に保存できます。 – Stefan

+0

OK、コードを追加しました。 – Spinner

答えて

4

私は2つのうちのいずれかをしようとするだろう:

  1. は、情報を保留中としてデータを保存してください:

    if (sms == null) { 
        mPendingResultCode = resultCode; 
        mPedingResultData = new Bundle(intent.getExtras()); } else { 
        handleData(resultCode, intent.getExtras()); } 
    

    そして後でonServiceConnectedコール handleData(mPedingResultCode, mPedingResultData)であれば、たとえば mPendingResultData != null

    そして、mPendingResultCodeとmPendingResultDataの設定を解除するか、 データの処理が完了したら、その他のインジケータが表示されます。

  2. 私はこれがわからないんだけど、おそらくonActivityResultにこのような何かを行うことによってイベントキューの背面に取り扱うデータを追加しようとするだろう:

    final Bundle data = new Bundle(intent.getExtras); 
    new Handler().postRunnable(new Runnable() { 
        public void run() { 
         "do some stuff with data and resultcode (which should be final in the parameter list anyway)" 
        } 
    } 
    

あなたは、あなたがしなければならない言ったようにオリエンテーションが変更されたときに再作成しないようにマニフェストを変更しないでください。それは問題を解決しない醜いハックであり、それが示唆されたときに私は好きではありません。そうするなら、言語のような他の設定が変更された場合や、リソースを節約するためにフレームワークによって一時的にアクティビティが破棄された場合でも、同じことが起こる可能性があります。

マニフェストのconfigchangesは、変更を再作成するのではなく、変更に対してコールバックを取得する場合にのみ使用する必要があります。理由。怠惰は一つではありません。

+0

ありがとう、私はあなたの最初の提案の行に沿って何かをやった。私は今、保存リクエストを保存するプライベートヘルパーメソッドを持っています。 onServiceConnected()は保留中の要求をチェックし、必要に応じて実行します。しかし今、別の問題が発見されましたが、これを閉じるでしょう。 – Spinner

関連する問題