我不知道如何为奥利奥的AlarmManager setExactAndAllowWhileIdle工作,并为此编写了非常简单的服务,但它没有工作,我真的无法理解。到目前为止,我所看到的所有原因都与我的代码无关。请指导我出错的地方。
private void startService() {
Log.d("testt", "MainActivity - startService");
Intent intent = new Intent(this, LocationReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 1,intent,PendingIntent.FLAG_UPDATE_CURRENT );
AlarmManager alarmManager =(AlarmManager)getSystemService(ALARM_SERVICE);
alarmManager.setExactAndAllowWhileIdle(AlarmManager.ELAPSED_REALTIME_WAKEUP, System.currentTimeMillis() + 60 * 1000, pendingIntent);
}
public class LocationReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.d("testt", "LocationReceiver - onReceive");
Intent i = new Intent(context, LocationService.class);
context.startService(intent);
}
}
public class LocationService extends IntentService {
public LocationService() {
super("any_name");
}
@Override
protected void onHandleIntent(@Nullable Intent intent) {
Log.d("testt", "LocationService - onHandleIntent");
}
}
<service android:name=".LocationService" android:exported="false"/>
<receiver android:name=".LocationReceiver"/>
</application>
答案 0 :(得分:0)
您可以尝试给定代码。您可以像这样直接调用LocationService,也可以参考此代码Autologout
Intent myIntent = new Intent(this, LocationService.class);
PendingIntent pendingIntent = PendingIntent.getService(this, 0, myIntent, 0);
AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.add(Calendar.MINUTE, 2);
alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
答案 1 :(得分:0)
关于您活动中的这行代码:
alarmManager.setExactAndAllowWhileIdle(AlarmManager.ELAPSED_REALTIME_WAKEUP, System.currentTimeMillis() + 60 * 1000, pendingIntent);
而不是System.currentTimeMillis(),你想使用SystemClock.elapsedRealtime();您的代码应如下所示:
alarmManager.setExactAndAllowWhileIdle(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + 60 * 1000, pendingIntent);
您需要使用自设备启动以来的毫秒数开始间隔时间计算,而不是自1970年1月1日以来的毫秒数。
答案 2 :(得分:0)
某些时间警报接收器未呼叫确切时间,如果未呼叫则等待一段时间。
对于服务,请更改您的广播接收器代码
公共类LocationReceiver扩展了BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.d("testt", "LocationReceiver - onReceive");
Intent i = new Intent(context, LocationService.class);
context.startForegroundService(intent);
}}
在您的服务OnCreate方法中。 startForeground(11,buildForegroundNotification());