受打ze模式影响的ForgroundService

时间:2018-07-14 13:06:52

标签: android broadcastreceiver delay foreground-service doze

我的警报应用程序一直很晚,尽管我是从ForegroundService语言的BroadcastReceiveronCreate()开始按时调用Service,但是{ {1}}被延迟调用(有时),我认为这是由于电话再次打do睡而无法执行之前造成的。

从Log.d中可以看到,该服务会及时启动并及时调用PlayerActivity-但在这种情况下,实际上是在1:40分钟后启动。 另外,该服务不会在经过随机延迟时间之前进入前台,也不会开始播放音乐(维护窗口?)

我们应该如何使设备保持足够长的唤醒时间以实际启动前台服务并及时输入预告片?

我正在使用onStartCommand()来调用AlarmReceiver-这在100%的情况下都能正常工作。启动服务后会发生延迟。

我应该提前15分钟启动服务,以确保它在实际闹钟时间之前进入前台,并在平均闹钟时间开始流媒体播放音乐并调用“活动”吗?

广播接收器

setExactAndAllowWhileIdle()

服务

public class AlarmReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {

    Log.d("Ben", "Alarmreceiver HELLO");

    String label = context.getText(R.string.defaultLabel).toString();
    int id = 1909;

    Bundle extras = intent.getExtras();

    if (extras != null) {

// kill running alarm activity
        if (extras.containsKey("autoKill")) {

            Log.d("Ben", "AlarmReceiver killing running alarm NOW.");

            Intent bc = new Intent("PLAYER_STOP_SELF");
            LocalBroadcastManager.getInstance(context).sendBroadcast(bc);

            context.stopService(new Intent(context, StreamService.class));
            return;
        }

        label = extras.getString("label");
        id = extras.getInt("id");
    }

    Log.d("Ben", "AlarmReceiver ok!");


// CALC NEXT ALARM and start StreamingService...

    if (Build.VERSION.SDK_INT >= 26) {
        context.startForegroundService(new Intent(context, StreamService.class));
        context.startForegroundService(new Intent(context, CalcNextAlarmService.class));
        Log.d("Ben", "SDK >= 26 *** context.startForegroundServices");
    }
    else {
        context.startService(new Intent(context, StreamService.class));
        context.startService(new Intent(context, CalcNextAlarmService.class));
        Log.d("Ben", "SDK < 26 *** context.startServices");
    }
}

相应的Log.d:

@Override
public void onCreate() {


// initializing variables, shared preferences,... not shown

    Log.d("Ben", "StreamService calling PlayerActivity now...");

    startActivity(new Intent(this, PlayerActivity.class).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK));

// NOTI AND FOREGROUND!
    Notification noti = createForegroundNotification();
    startForeground(ntfctnId, noti);
// It doesn't even get to here before the delay...
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {

    Log.d("Ben", "StreamService onStartCommand");

该警报在95%的使用时间中效果很好,但有时会出现此打do睡现象,并在晚1-15分钟后启动警报-我已经调试了2个多星期,重写了整个服务和Receiver类2次并开始变得疯狂,请帮忙。

编辑

我最终使用了一个唤醒的BroadcastReceiver和一个唤醒的服务(针对所有<26的API),然后该服务相应地调用了其他服务(我之前在AlarmReceiver中所做的工作-仍然对API> = 26进行了此操作)< / p>

到目前为止,它似乎运行良好-仅在我的其中一款运行Lineage的测试设备上,警报有时有时会响起,在我自己的日常电话中,我也正在运行Lineage,但是一切正常。也许SGS 4 mini太旧了(我真的不相信这一点,但只要没人抱怨,我就必须假设它能按预期工作)

感谢@Elletlar的帮助。

0 个答案:

没有答案