不从AlarmManager调用BroadcastReceiver

时间:2017-10-11 18:55:36

标签: android broadcastreceiver alarmmanager

我不知道如何为奥利奥的AlarmManager setExactAndAllowWhileIdle工作,并为此编写了非常简单的服务,但它没有工作,我真的无法理解。到目前为止,我所看到的所有原因都与我的代码无关。请指导我出错的地方。

MainActivity

   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>

3 个答案:

答案 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());