0

私はこれに数日間苦労してきました。私がやりたいのは、2〜3分間隔で定期的にサービスを実行することです。インターフェイスと最初のアラームの設定を担当するアクティビティがあります。

アラームは、次のようなBroadcastReceiverによって構成されます。

public class Receiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
          String message = "Alarm worked";
          Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
          setAlarm(context);
    }

    public void setAlarm(Context context){
        AlarmManager am = (AlarmManager) context.
                              getSystemService(Context.ALARM_SERVICE);
        Intent intent = new Intent(context, Receiver.class);
        PendingIntent pi = PendingIntent.getBroadcast(context, 
                              0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
        Intent dailyUpdater = new Intent(context, DiscoveryService.class);
        context.startService(dailyUpdater);
        am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() 
                              + (1000 * 30) , pi);
    }
}

AlarmManagerにsetRepeatingを使用してみましたが、それでも同じ効果があります。何が起こるかというと、AlarmManagerは正常に動作し、レシーバーが取得してonReceiveを定期的に実行するインテントを起動します。ただし、サービスを実行するのは初めてです。初回以降もアラームは鳴りますが、サービスは実行されません。

同様の問題を抱えている人々からいくつかのスレッドを読みましたが、そのうちの1つは、PendingIntentが1回の送信でしか持続しないと述べました。したがって、毎回更新するためにpendingIntentフラグを設定できるように、毎回アラームを設定することをオプトアウトしました。

サービスをintentServiceにしようとしましたが、これは問題ありませんが、Bluetooth検出が終了するのを待たずに、intentServiceスレッドが終了するため、サービス内のBluetoothスキャナーが機能しません。

誰かが私を助けることができるものを知っていますか?

これが私のサービスの一部です:

public class DiscoveryService extends Service {
    public void onCreate() {
        super.onCreate();
        Toast.makeText(this, "MyAlarmService.onCreate()", 
                                 Toast.LENGTH_LONG).show();
        findEverything();
    }
}

編集:これは私が現在持っているコードです。

public void onReceive(Context context, Intent intent) {
      String message = "Alarm worked";
      Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
      Intent dailyUpdater = new Intent(context, DiscoveryService.class);
      context.startService(dailyUpdater);
}

public void setAlarm(Context context){
    // get a Calendar object with current time
    AlarmManager am=(AlarmManager)context. 
                             getSystemService(Context.ALARM_SERVICE);
    Intent intent = new Intent(context, Receiver.class);
    PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent,
                             PendingIntent.FLAG_UPDATE_CURRENT);
    am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 
                             (1000 * 30) , pi);
}
4

1 に答える 1

2

何が起こるかというと、AlarmManager が本来あるべき方法で動作し、レシーバーが取得して定期的に onReceive を実行するインテントを起動します。ただし、サービスは初回のみ実行されます。初回以降、アラームは鳴り続けますが、サービスは実行されません。

アラームをスケジュールstartService()しているときに 1 回呼び出しています。からはまったく電話ていません。それでも、 を介してアラームをスケジュールしています。したがって、アラームが鳴ると、コマンドを送信していないため、サービスにはコマンドが送信されません。startService() BroadcastReceiverBroadcastReceiver

同様の問題を抱えている人々からいくつかのスレッドを読みましたが、そのうちの 1 つは、PendingIntent が 1 回の送信でしか持続しないと述べていました。

を使用する場合のみですFLAG_ONE_SHOT

何が私を助けることができるか誰にも分かりますか?

メソッドからではなく、メソッドstartService()から呼び出します。また、アラームを使用していて my を使用できないため、すべての管理ロジックを追加します。onReceive()setAlarm()WakeLock_WAKEUPWakefulIntentService

于 2013-03-03T12:47:49.640 に答える