を開始したアクティビティの参照を渡すことができると思いますStarted Service
。サービスはアクティビティの参照を持っているため、その参照のメソッドを呼び出すことができます。
アクティビティが破棄されても、サービスがまだバックグラウンドで実行されている場合、サービスがアクティビティの参照のメソッドを呼び出すとどうなりますか?
を開始したアクティビティの参照を渡すことができると思いますStarted Service
。サービスはアクティビティの参照を持っているため、その参照のメソッドを呼び出すことができます。
アクティビティが破棄されても、サービスがまだバックグラウンドで実行されている場合、サービスがアクティビティの参照のメソッドを呼び出すとどうなりますか?
一般に、アクティビティへの参照を保存することは絶対に避けてください。その場合は、アクティビティのonDestroy()
で解放する必要があります。そうしないと、メモリ リークが発生する可能性があります。参照をサービスに保存する理由は何ですか?
EDIT:
トースト通知またはステータス バー通知を使用して、バックグラウンド作業が完了したことをユーザーに通知できます。これは一般的な方法です。と通信する必要がある場合Activity
は、いくつかの方法でそれを実現できます。Activity
、 useIntents
または useにバインドできますAIDL
。詳細については、こちらをご覧ください。
ResultReceiverIntents
とともに使用するオプションの 1 つについて説明します。
Service
アプリケーションのメイン スレッドで実行されるため、ブロック操作を実行している場合は、サービス内で新しいスレッドを開始する必要があります。この場合、作業を簡素化し、すでにスレッド処理を実装しているIntentServiceを使用できます。
ResultReceiverServiceResultReceiver
から拡張されたカスタムを作成します。そのインターフェイスを my に実装し、開始時にレシーバー オブジェクトを に渡します。Activity
Service
IntentService
カスタムResultReceiver
:
public class ServiceResultReceiver extends ResultReceiver {
private Receiver mReceiver;
public ServiceResultReceiver(Handler handler) {
super(handler);
}
public void setReceiver(Receiver receiver) {
mReceiver = receiver;
}
public interface Receiver {
public void onReceiveResult(int resultCode, Bundle resultData);
}
@Override
protected void onReceiveResult(int resultCode, Bundle resultData) {
if (mReceiver != null) {
mReceiver.onReceiveResult(resultCode, resultData);
}
}
}
あなたのActivity
:
public class MyActivity extends Activity implements ServiceResultReceiver.Receiver {
private ServiceResultReceiver mReceiver;
...
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
mReceiver = new ServiceResultReceiver(new Handler());
mReceiver.setReceiver(this);
// starting a service
final Intent intent = new Intent(this, MyService.class);
intent.putExtra("receiver", mReceiver);
startService(intent);
}
...
@Override
public void onReceiveResult(int resultCode, Bundle resultData) {
// here you can handle data which came from your service.
Toast.makeText(this, "onReceiveResult()", Toast.LENGTH_SHORT).show();
}
あなたのService
:
public class MyService extends IntentService {
...
@Override
protected void onHandleIntent(Intent intent) {
// executing your task
...
// getting the receiver and sending back data in Bundle (here in this example we are sending no data)
final ResultReceiver receiver = intent.getParcelableExtra("receiver");
if (receiver != null) {
receiver.send(0, null);
}
}
}