1

いくつかの作業を行うためにIntentServiceクラスを呼び出しているアクティビティクラスがあります

Intent intent = new Intent(this, NetworkHandler.class);

PendingIntent pendingIntent = createPendingResult(1, intent, PendingIntent.FLAG_ONE_SHOT);
intent.putExtra(NetworkHandler.REFRESH_CONTENT, NetworkHandler.GRO);
intent.putExtra("pendingIntent", pendingIntent);

startService(intent);

IntentServiceが完了した後、次の方法でアクティビティへのコールバックをトリガーします

pendingIntent.send();

ただし、IntentServiceがバックグラウンドで実行されているときにユーザーが[戻る]ボタンを押した場合、保留中のインテントがコールバックをトリガーしようとすると、NullPointExceptionが発生します。

この状況を処理する正しい方法は何でしょうか?

4

2 に答える 2

0

createPendingResult()、簡単ですが、オリジナルがActivity固執することを前提としています-それはサポートするためにありstartActivityForResult()ます。次のような、サービスからアクティビティへの他の通信パスを使用することをお勧めします。

于 2013-03-14T00:13:58.153 に答える
0

私はこの問題のためにプライベートBroadcastReceiverクラスを使用することになりました。

private class RefreshStatusReceiver extends BroadcastReceiver {
    private RefreshStatusReceiver() {

    }

    @Override
    public void onReceive(Context context, Intent intent) {
        int requestType = intent.getBundleExtra("bundle").getInt(NetworkHandler.REQUEST_TYPE);

        if (requestType == NetworkHandler.FLY) {
            configHandler();
        }
    }
}

onPauseメソッドとonResumeメソッドでそれらを登録および登録解除します

@Override
protected void onResume() {
    super.onResume();
    mRefreshStatusReceiver = new RefreshStatusReceiver();
    IntentFilter mStatusIntentFilter = new IntentFilter(NetworkHandler.REFRESH_COMPLETED_ACTION);
    mStatusIntentFilter.addCategory(Intent.CATEGORY_DEFAULT);
    LocalBroadcastManager.getInstance(this).registerReceiver(mRefreshStatusReceiver, mStatusIntentFilter);
}

@Override
protected void onPause() {
    super.onPause();
    LocalBroadcastManager.getInstance(this).unregisterReceiver(mRefreshStatusReceiver);
}

IntentServiceで、次のようにコールバックを開始しました

    Bundle bundle = new Bundle();
    bundle.putInt(CONNECTION_STATE, connectionState);
    bundle.putInt(REQUEST_TYPE, requestType);
    Intent localIntent = new Intent(REFRESH_COMPLETED_ACTION).putExtra("bundle",bundle);
    LocalBroadcastManager.getInstance(this).sendBroadcast(localIntent);

Ottoバスクラスは、呼び出し元と呼び出し先の両方がメインスレッドにある場合にのみ機能するため、使用できませんでした(別のスレッドが必要な場合は、greenbotのEventbusを使用してください)。また、コールバックは別のコンテキストで呼び出されるため、元のアクティビティのコンテキストなどからトーストを作成することはできません。

于 2013-03-17T23:13:28.203 に答える