1

まれに、携帯電話が状態 (「おかしな状態」と呼ばれる) になり、インテント サービスがブロードキャスト レシーバーから startService コマンドを取得できないという問題が発生します。(はい、マニフェストには受信者とサービスが定義されています)。

この例では、プッシュ通知をリッスンしてから CheckinService を呼び出しています。レシーバー:

public class PushReceiver extends BroadcastReceiver {

private static final String LOG_TAG = "push_receiver";

@Override
public void onReceive(Context context, Intent intent) {
    logger.putExtra("debug", "Received Push");

    Intent serviceIntent = new Intent(context, CheckinService.class);
    context.startService(serviceIntent);

    logger.putExtra("debug", "Sent to Service");
}

サービス:

public class CheckinService extends IntentService {
    private static final String LOG_TAG = "checkin_service";
    public static final int SERVICE_ID = 3;

    public CheckinService() {
        super(LOG_TAG);
        Log.i(LOG_TAG, "Service says: Checkin service started no constructor");
    }

    public CheckinService(String name) {
            super(LOG_TAG);
        Log.i(LOG_TAG, "Service says: Checkin service started with constructor");
    }

    @Override
    protected void onHandleIntent(Intent intent) {
         Log.i(LOG_TAG, "Auto Checkin started");
         .....tons of genius logic.....
        }
}

したがって、電話が面白い状態になると、「受信したプッシュ」がログに記録され、「サービスに送信」がログに記録されますが、サービスのコンストラクターと onHandleIntent メソッドは呼び出されません。
また、これはプッシュだけでなく、 inexactRepeatingAlarm やおそらく他のレシーバーでも発生しますが、これら2つは確実に確認されています。

繰り返しますが、これは非常にまれであり、電話が一定期間使用されなかった後に発生するようです。省電力モードに入る可能性があります。

また、アプリケーションのプロセスを終了すると、これが解消されます。

4

1 に答える 1

1

ここで何が起こっているのかを理解しました。

IntentService はシングル スレッドです。したがって、私の「.....トンの天才ロジック.....」の何かがブロックされていた場合 (タイムアウトのない http 要求など)、サービスに入った次のインテントは処理されません。

素敵で謙虚です。

于 2012-10-20T18:34:50.783 に答える