gpt4 book ai didi

android - 唤醒 IntentService 在 sleep 模式下工作不完整

转载 作者:行者123 更新时间:2023-11-29 22:03:03 25 4
gpt4 key购买 nike

我已经为测试模式设置了 1 分钟的 AlarmManager。它向 OnAlarmReceiver 发送广播。OnAlarmReceiver 启动 sendWakefulWork(context, TaskService);在 TaskService 的 doWakefulWork() 方法中,我发送了触发通知的 sendOrderedBroadcast。这很好用 ^ 出现声音和振动通知。但只有当手机处于 Activity 模式时。当手机处于 sleep 模式(屏幕关闭)时,通知期间只有振动和闪光灯工作。 sleep 模式下通知没有声音,只有振动。有时它会发出声音,但只是有时会发出声音,例如每小时发出 1 次声音,但它应该每分钟发出声音。此外,当手机连接到电脑时,它在 sleep 模式下每分钟都会发出声音,但当我从电脑上拔下手机时,它只会开始振动。当我打开屏幕时,一切都变得正常:通知播放声音 + 振动。

所以我不知道是我的代码有问题还是我的手机 (HTC Desire Android 2.2) 有问题

我已经尝试了很多方法来修复它:

  • 默认和自定义声音
  • notification.audioStreamType = AudioManager.STREAM_SYSTEM 等
  • 带闪光灯和不带闪光灯
  • 有振动和无振动

没有。只有声音在 sleep 模式下消失,振动效果完美。

public class OnBootReceiver extends BroadcastReceiver {

public static void setAlarm(Context ctxt) {

AlarmManager mgr = (AlarmManager) ctxt.getSystemService(Context.ALARM_SERVICE);
mgr.setRepeating(AlarmManager.RTC_WAKEUP,
System.currentTimeMillis()+1000,
1*60*1000,
getPendingIntent(ctxt));
}

public static void cancelAlarm(Context ctxt) {
AlarmManager mgr = (AlarmManager) ctxt.getSystemService(Context.ALARM_SERVICE);
mgr.cancel(getPendingIntent(ctxt));
}

private static PendingIntent getPendingIntent(Context ctxt) {
Intent i=new Intent(ctxt, OnAlarmReceiver.class);
return PendingIntent.getBroadcast(ctxt, 0, i, PendingIntent.FLAG_CANCEL_CURRENT);
}

@Override
public void onReceive(Context ctxt, Intent intent) {
setAlarm(ctxt);
}
}

我在 TaskService 类中的 doWakefulWork 方法:

protected void doWakefulWork(Intent intent) {
Intent mIntent = new Intent(EXERCISE_EVENT);
mIntent.putExtra(StringUtils.PARAM_NEXT_TASK_TIME, nextStringTime);
mIntent.putExtra(StringUtils.PARAM_TASK_NUMBER, taskNumber);

sendOrderedBroadcast(mIntent, null);
}

这是我的 NotificationBrodcastReceiver :

public class NotificationBrodcastReceiver extends android.content.BroadcastReceiver {

public void onReceive(Context ctx, Intent intent) {

String ns = Context.NOTIFICATION_SERVICE;
NotificationManager mNotificationManager = (NotificationManager) ctx.getSystemService(ns);

int icon = R.drawable.notif_icon;
CharSequence tickerText = ctx.getResources().getString(R.string.notification_ticker);
long when = System.currentTimeMillis();

Notification notification = new Notification(icon, tickerText, when);
notification.flags |= Notification.FLAG_AUTO_CANCEL;

notification.defaults |= Notification.DEFAULT_SOUND;
notification.defaults |= Notification.DEFAULT_VIBRATE;

Intent notificationIntent = new Intent(ctx, MainActivity.class);
PendingIntent contentIntent = PendingIntent.getActivity(ctx, 0, notificationIntent, 0);
notification.setLatestEventInfo(ctx, "contentTitle", "contentText", contentIntent);
mNotificationManager.notify(NOTIFICATION_ID, notification);
}
}

最佳答案

您正在使用有序广播来发出您的通知。据推测,您这样做是因为如果 Activity 在前台并且对该广播具有更高优先级的 BroadcastReceiver,则您希望该 Activity 处理请求。

该模式适用于非清醒情况。然而,一旦 doWakefulWork() 结束,没有任何东西可以让设备保持唤醒状态,因此设备将重新进入休眠状态。您订购的 Broadcast 是异步发生的,因此它的工作将在 doWakefulWork() 结束后发生,因此您的 Notification 可能根本不会发生。如果 Notification 部分发生,正如你所描述的,我个人认为这种行为是 Android 中的一个错误(它应该拥有自己的 WakeLock 以便回放铃声),但是您的 BroadcastReceiver 完全有可能根本无法获得控制权,因为设备在广播传送之前就睡着了。

你的 hold-a-WakeLock-for-two-seconds 解决方法将增加成功的几率,但也不能保证。确保您有机会发出 Notification 的唯一保证方法是:

  1. doWakefulWork() 中完成这项工作,或者

  2. 保持 WakeLock 直到广播完成并引发 Notification

我会在未来为 WakefulIntentService 框架添加额外的功能,以更好地处理您的场景,因为您似乎想做的事情是合理的,并且有一个共同点会很好模式的实现。但是,您尝试做的事情绝对超出了 WakefulIntentService 的当前范围。

关于android - 唤醒 IntentService 在 sleep 模式下工作不完整,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11478824/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com