2013-09-21 11 views
6

アクティビティがResultReceiverをインスタンス化し、onReceiveResultをオーバーライドします。次に、アクティビティはIntentをIntentServiceに送信し、ResultReceiverを追加として含めます。 IntentServiceが処理を終えると、それはResultReceiverにメッセージを送り、それをonReceiveResultで処理します。死んだResultReceiverに応答するIntentService

問題は、ユーザーがアクティビティから移動しても結果がまだすべての種類の問題を引き起こすResultReceiverに返された場合です。この動作を停止する方法はありませんか?私は、アクティビティのonDestroy()でIntentServiceを停止しようとしましたが、結果はまだ返されます。ここで

は、ここでサンプルアクティビティ

public class Foo extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     Intent i = new Intent(this, SampleIntentService.class); 
     i.putExtra("receiver", mReceiver); 
     startService(i); 
    } 

    @Override 
    public void onDestroy() { 
     stopService(new Intent(this, SampleIntentService.class)); 
     mReceiver = null; 
     super.onDestroy(); 
    } 

    ResultReceiver mReceiver = new ResultReceiver(new Handler()) { 
     @Override 
     protected void onReceiveResult(int resultCode, Bundle resultData) { 
      // Handle response from IntentService here 
     } 
    }; 
} 

である私は、次のようにカスタムResultReceiverを作成することで、この問題を解決したサンプルIntentService

public class SampleIntentService extends IntentService { 
    public SampleIntentService() { 
     super(SampleIntentService.class.getName()); 
    } 

    @Override 
    protected void onHandleIntent(Intent intent) { 
    ResultReceiver rec = intent.getParcelableExtra("receiver"); 
     if (rec != null) { 
      rec.send(200, null); 
     } 
    } 
} 

答えて

12

です。

public class Foo extends Activity implements Receiver { 
    private SampleResultReceiver mReceiver; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     mReceiver = new SampleResultReceiver(new Handler()); 
     mReceiver.setReceiver(this); 

     Intent i = new Intent(this, SampleIntentService.class); 
     i.putExtra("receiver", mReceiver); 
     startService(i); 
    } 

    @Override 
    public void onDestroy() { 
     if (mReceiver != null) { 
      mReceiver.setReceiver(null); 
     } 
     super.onDestroy(); 
    } 

    @Override 
    protected void onReceiveResult(int resultCode, Bundle resultData) { 
     // Handle response from IntentService here 
    } 
} 

このアクティビティが破棄された後にどこにも終わるしないように、カスタムResultReceiverに送信されたすべてのメッセージが発生します:)

+0

良い解決策:

public class SampleResultReceiver extends ResultReceiver { private Receiver mReceiver; public SampleResultReceiver(Handler handler) { super(handler); } public void setReceiver(Receiver receiver) { mReceiver = receiver; } public interface Receiver { void onReceiveResult(int resultCode, Bundle resultData); } @Override protected void onReceiveResult(int resultCode, Bundle resultData) { if (mReceiver != null) { mReceiver.onReceiveResult(resultCode, resultData); } } } 

はその後、私の活動に、私は次の操作を行います!あなたのアクティビティの代わりに同じアプローチをフラグメントで使用しました – moondroid

関連する問題