私はこれに数日間苦労してきました。私がやりたいのは、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);
}