2

我的警报应用程序一直迟到,虽然我是从及时调用的 gehts 开始的ForegroundServiceBroadcastReceiver但是延迟onCreate()调用(有时),我认为这是来自电话在它可以执行之前再次陷入瞌睡它...ServiceonStartCommand()

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

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

setExactAndAllowWhileIdle()用来调用 AlarmReceiver -这适用于 100% 的情况。延迟发生在启动服务之后。

我是否应该提前 15 分钟启动服务,以确保它在实际闹钟时间前进入前台并实际开始播放音乐并在实际闹钟时间调用 Activity?

广播接收器

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");
    }
}

服务

@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");

根据Log.d:

07-14 14:30:01.335 D/Ben: Alarmreceiver HELLO
07-14 14:30:01.364 D/Ben: AlarmReceiver ok! (label: Alarm 1 - id: 10001)
07-14 14:30:01.372 D/Ben: SDK < 26 *** context.startServices
07-14 14:30:01.378 D/Ben: StreamService calling PlayerActivity now...
07-14 14:31:41.116 D/Ben: StreamService onStartCommand
07-14 14:31:41.224 D/Ben: StreamService wakeLock.isHeld()
    StreamService wifiLock.isHeld()
    *** onStartCommand ELSE ***
07-14 14:31:41.227 D/Ben: preparing player - start streaming in 2 seconds...
07-14 14:31:41.365 D/Ben: wakeLock.isHeld()
    wifiLock.isHeld()
07-14 14:31:41.366 D/Ben: PlayerActivity.onCreate()
07-14 14:31:43.229 D/Ben: Start Streaming now! (normal alarm)
07-14 14:31:43.241 D/Ben: buffering
07-14 14:31:43.242 D/Ben: buffering
07-14 14:31:44.345 D/Ben: ready

闹钟在 95% 的使用时间里都能正常工作,但有时这种打瞌睡会出现并在 1-15 分钟后启动闹钟 - 我已经调试了两个多星期了,重写了整个服务和接收器类 2 次开始变得疯狂,请帮助。

编辑

我最终使用了一个唤醒广播接收器和一个唤醒服务(对于所有 API < 26),然后相应地调用其他服务(我之前在 AlarmReceiver 中所做的 - 并且仍然为 API >= 26 做)

到目前为止,它似乎工作得很好——只有在我的一台运行 Lineage 的测试设备上,有时警报会迟到,在我自己的日常使用电话上,我也在运行 Lineage,但它做得很好。也许 SGS 4 mini 太旧了(我真的不相信这一点,但只要没有人抱怨,我就不得不假设它按预期工作)

感谢您的帮助@Elletlar。

4

0 回答 0