Android AlarmManager和IntentService - Marshallow及以上版本

时间:2017-05-16 08:37:59

标签: android alarmmanager android-6.0-marshmallow intentservice android-7.0-nougat

如何使AlarmManager与IntentService一起使用,每隔5秒重复一次? 是否有可能绕过"绕过" 1/15分钟的障碍(空闲/打盹模式)?它必须一直工作(即使应用程序已关闭)。

修改 这里我有来自WakefulBroadcastReceiver的AlarmReceiver代码。

    @Override
public void onReceive(Context context, Intent intent) {
    Intent service = new Intent(context, VidService.class);
    startWakefulService(context, service);
}

    public void setAlarm(Context context) {
    alarmMgr = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    Intent intent = new Intent(context, AlarmReceiver.class);
    alarmIntent = PendingIntent.getBroadcast(context, 0, intent, 0);

    int currentapiVersion = android.os.Build.VERSION.SDK_INT;
    if (currentapiVersion < android.os.Build.VERSION_CODES.KITKAT) {
        alarmMgr.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(), 5000, alarmIntent);
    } else {
        if (currentapiVersion < android.os.Build.VERSION_CODES.M) {
            alarmMgr.setExact(AlarmManager.RTC_WAKEUP, 5000, alarmIntent);
        } else {
            alarmMgr.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, 5000, alarmIntent);
        }
    }
}

还有我的IntentService代码。

    @Override
protected void onHandleIntent(@Nullable Intent intent) {
    checkIncommingCall();
    AlarmReceiver.completeWakefulIntent(intent);
}

不幸的是,我的服务&#34;工作&#34;只有一次。我在Android 7.0上进行了测试,所以我的问题是 - setExactAndAllowWhileIdle重复吗?

2 个答案:

答案 0 :(得分:0)

if element.name === 'home'

尽管如此,我强烈建议不要每5秒唤醒一次设备! 这真的消耗了电池!

修改

@SuppressLint("NewApi")
    private static void startbyalarm(Context ctx, boolean wakeup, long nexttime) {
        AlarmManager am = (AlarmManager) ctx.getSystemService(Activity.ALARM_SERVICE);
        Intent intent = new Intent(BRPing.INTENT_FILTER);
        PendingIntent pi = PendingIntent.getBroadcast(ctx, intentalarm, intent, PendingIntent.FLAG_CANCEL_CURRENT);
        int currentapiVersion = android.os.Build.VERSION.SDK_INT;
        if (currentapiVersion < android.os.Build.VERSION_CODES.KITKAT){
            am.set(wakeup?AlarmManager.RTC_WAKEUP:, nexttime, pi);
        } else {
            if (currentapiVersion < android.os.Build.VERSION_CODES.M) {
                am.setExact(AlarmManager.RTC_WAKEUP, nexttime, pi);
            } else {
                am.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, nexttime, pi);
            }
        }
    }

的manifest.xml:

public class BRPing extends WakefulBroadcastReceiver {
    public static final String INTENT_FILTER = "Some.Intent.Name.BRPing";
    @Override
    public void onReceive(Context ctx, Intent intent) {
        ComponentName comp = new ComponentName(ctx.getPackageName(),
                YourService.class.getName());
        startWakefulService(ctx, intent.setComponent(comp));
    }

}

答案 1 :(得分:0)

  

setExactAndAllowWhileIdle重复吗?

不,不是。如果您需要重复,则必须在当前警报发生时安排新警报。

  

如何使AlarmManager与IntentService一起使用,每隔5秒重复一次?

这是不可能的,因为当打盹处于活动状态时,两次警报之间至少需要15分钟。

  

是否有可能“绕过”1/15分钟的障碍(空闲/打盹模式)?它必须一直工作(即使应用程序已关闭)。

不,没有。