我将我的应用程序升级targetSdkVersion到compileSdkVersionSDK 31,并开始在后台更新小部件的服务中的应用程序中收到以下崩溃消息。
java.lang.RuntimeException:
at android.app.ActivityThread.handleReceiver (ActivityThread.java:4321)
at android.app.ActivityThread.access$1600 (ActivityThread.java:247)
at android.app.ActivityThread$H.handleMessage (ActivityThread.java:2068)
at android.os.Handler.dispatchMessage (Handler.java:106)
at android.os.Looper.loopOnce (Looper.java:201)
at android.os.Looper.loop (Looper.java:288)
at android.app.ActivityThread.main (ActivityThread.java:7842)
at java.lang.reflect.Method.invoke (Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:548)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1003)
Caused by: android.app.ForegroundServiceStartNotAllowedException:
at android.app.ForegroundServiceStartNotAllowedException$1.createFromParcel (ForegroundServiceStartNotAllowedException.java:54)
at android.app.ForegroundServiceStartNotAllowedException$1.createFromParcel (ForegroundServiceStartNotAllowedException.java:50)
at android.os.Parcel.readParcelable (Parcel.java:3333)
at android.os.Parcel.createExceptionOrNull (Parcel.java:2420)
at android.os.Parcel.createException (Parcel.java:2409)
at android.os.Parcel.readException (Parcel.java:2392)
at android.os.Parcel.readException (Parcel.java:2334)
at android.app.IActivityManager$Stub$Proxy.startService (IActivityManager.java:5971)
at android.app.ContextImpl.startServiceCommon (ContextImpl.java:1847)
at android.app.ContextImpl.startForegroundService (ContextImpl.java:1823)
at android.content.ContextWrapper.startForegroundService (ContextWrapper.java:779)
at android.content.ContextWrapper.startForegroundService (ContextWrapper.java:779)
at com.mypackage.appname.ui.widget.widget_package.WidgetClassName.onUpdate (WidgetClassName.java:48) …Run Code Online (Sandbox Code Playgroud) 我正在开发一个SDK,需要从后台启动Foreground服务。因为它使用的是后台定位和蓝牙相关的作品。如果应用程序被终止,监控将在后台执行。这就是我使用前台服务的原因。有一个条件是从后台启动前台服务。
目前,我的 SDK 使用Service来处理这项工作。但Android 12上不支持从后台启动服务。
我试图从后台启动服务,下面的异常抛出。
ForegroundServiceStartNotAllowedException: Service.startForeground() not allowed due to mAllowStartForeground false
Run Code Online (Sandbox Code Playgroud)
我如何使用WorkManager 来解决这个问题,我的所有处理都是由 Service 类完成的,如何将 Service 对象传递给Worker类并在 Worker 类中启动此作业。
实际上,我的项目是基于信标技术的。信标信号用于向用户显示不同的推荐。
在我当前的实现中,如果应用程序被用户杀死,并且还接受前台服务,则SDK将在后台运行。并检测信标并提供适当的操作。
我的实现是,如果应用程序使用前台服务“关闭”来初始化我的 SDK,那么稍后,当应用程序位于后台并尝试从后台启动前台服务时,会抛出此异常。与前台服务相关的决策由服务器端 API 持有。我定期检查服务器端值是否更改,如果值更改,则更改后的操作会反映在 SDK 中。
android android-service foregroundnotification android-workmanager android-12
我已经设置了一个重复时间的AlarmManagr.这是我设置它的方法:
public void setAlarmManager(Context context, Intent intent) {
PendingIntent pendingIntent;
pendingIntent = PendingIntent.getService(context, 0, intent, 0);
AlarmManager alarmManager =
(AlarmManager)context.getSystemService(context.ALARM_SERVICE);
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.add(Calendar.SECOND, 10);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,
calendar.getTimeInMillis(),
40000, pendingIntent);
}
Run Code Online (Sandbox Code Playgroud)
这工作正常,除非我的设备进入睡眠模式时警报停止工作,直到我手动唤醒我的设备.唤醒设备后,AlarmManager再次开始工作.
如何让管理员即使在睡眠模式下也能运行?