1

を開始したアクティビティの参照を渡すことができると思いますStarted Service。サービスはアクティビティの参照を持っているため、その参照のメソッドを呼び出すことができます。

アクティビティが破棄されても、サービスがまだバックグラウンドで実行されている場合、サービスがアクティビティの参照のメソッドを呼び出すとどうなりますか?

4

1 に答える 1

1

一般に、アクティビティへの参照を保存することは絶対に避けてください。その場合は、アクティビティのonDestroy()で解放する必要があります。そうしないと、メモリ リークが発生する可能性があります。参照をサービスに保存する理由は何ですか?

EDIT:

トースト通知またはステータス バー通知を使用して、バックグラウンド作業が完了したことをユーザーに通知できます。これは一般的な方法です。と通信する必要がある場合Activityは、いくつかの方法でそれを実現できます。Activity、 useIntentsまたは useにバインドできますAIDL詳細については、こちらをご覧ください。

ResultReceiverIntentsとともに使用するオプションの 1 つについて説明します。

Serviceアプリケーションのメイン スレッドで実行されるため、ブロック操作を実行している場合は、サービス内で新しいスレッドを開始する必要があります。この場合、作業を簡素化し、すでにスレッド処理を実装しているIntentServiceを使用できます。

ResultReceiverServiceResultReceiverから拡張されたカスタムを作成します。そのインターフェイスを my に実装し、開始時にレシーバー オブジェクトを に渡します。ActivityServiceIntentService

カスタム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);
        }
    }
}
于 2012-07-20T19:50:38.080 に答える