gpt4 book ai didi

Android:BroadcastReceiver 不会收听 BOOT_COMPLETED

转载 作者:行者123 更新时间:2023-11-30 04:58:34 26 4
gpt4 key购买 nike

我的应用程序每天推送一次通知(这是正常工作的)但在设备重启后通知不会再次触发。

我试图设置一个监听 BOOT_COMPLETED 的 BroadcastReceiver,但没有成功。

AndroidManifest.xml:

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
...
<receiver android:name=".helpers.notification.AlarmRebootReceiver"
android:enabled="false">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>

广播接收者:

public class AlarmRebootReceiver extends BroadcastReceiver {

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

try {
Intent notificationIntent = new Intent("android.media.action.DISPLAY_NOTIFICATION");
notificationIntent.addCategory("android.intent.category.DEFAULT");

String notificationMessage = TMLocale.getStringResourceByName("reminder_newthought");
String notificationTitle = TMLocale.getStringResourceByName("app_name");

TMNotification.Notify(notificationTitle, notificationMessage, Enum.ArtAndWordsNotification.NEWTHOUGHT, oContext);

TMNotification.cancelNewThoughtAlarm(oContext);
scheduleNewThoughtAlarm(oContext);
} catch (Exception e) {
ExceptionHandler.logException(e);
}
}

private void scheduleNewThoughtAlarm(Context oContext) {

Calendar cal = Calendar.getInstance();
int day = cal.get(Calendar.DAY_OF_MONTH);
int month = cal.get(Calendar.MONTH);
int year = cal.get(Calendar.YEAR);
int hour = cal.get(Calendar.HOUR_OF_DAY);
int minutes = cal.get(Calendar.MINUTE) + 1;
int seconds = cal.get(Calendar.SECOND);

Calendar newCalendar = TMDate.generateCalendar(day, month, year, hour, minutes, seconds);
TMNotification.scheduleNewThoughtAlarm(oContext, newCalendar, null);
}
}

我在 AndroidManifest 中将 boot receiver enabled 设置为 false,并在创建警报时通过代码将其设置为 true,正如官方文档中所建议的那样(这是为了让您仅在需要时收听 boot completed)。

启动通知的地方:

private static void doNewThoughtSchedule(Context oContext, int reminderPreference, boolean randomNotificationsPreference,
Calendar calendar, Intent notificationIntent){

ComponentName receiver = new ComponentName(ApplicationContext.get(), AlarmRebootReceiver.class);
PackageManager pm = ApplicationContext.get().getPackageManager();

pm.setComponentEnabledSetting(receiver,
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP);

...
}

显然代码中的一切都很好,但重启设备不会再次推送通知。

在华为 Android 9 设备和较旧的 Android 4.4 手机中进行了测试。都没有用。

有什么帮助吗?

附言。 TMNotification.scheduleNewThoughtAlarm 方法无关紧要,因为它工作正常(设置一个简单的 toast 甚至不会在 onReceive 中显示)。

PS2。这很奇怪,但是完全按照这里的官方文档也没有用:https://developer.android.com/training/scheduling/alarms.html#java (其中标题是“设备重启时启动警报”)。

最佳答案

设置多个 intent-filer action 可能会受到限制。因此,将您的定义更改为下一个。

<!-- Don't forget about permission -->
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>


<!-- ... -->
<receiver android:name=".helpers.notification.AlarmRebootReceiver"
android:permission="android.permission.RECEIVE_BOOT_COMPLETED">

<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>

对于所有其他 Intent 过滤器,请使用单独的 Receiver。现在您可以在您的方法中接收事件。只需打印日志,以确保偶数即将到来。很少有设备可以检查它不是特定于设备的。

public class AlarmRebootReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context oContext, Intent intent) {
Log.d("", "Event Received");
/**
* .....
**/
}
}

关于Android:BroadcastReceiver 不会收听 BOOT_COMPLETED,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58697751/

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