在某些 activity 启动之前,小部件无法在 Android 11 的设备启动时启动服务
Widget can't start a service on device boot on Android 11 until some activity is launched
val startServiceIntent = TestService.getServiceIntent(context).let {
PendingIntent.getService(context, 0, it, PendingIntent.FLAG_UPDATE_CURRENT)
}
val views = RemoteViews(context.packageName, R.layout.layout_app_widget).apply {
setOnClickPendingIntent(R.id.start_service_btn, startServiceIntent) // doesn't work on boot device
setOnClickPendingIntent(R.id.start_activity_btn, startActivityIntent) // works fine
}
appWidgetManager.updateAppWidget(appWidgetId, views)
如何对待这种行为?我怎样才能至少向用户显示一条消息,即在他启动应用程序(使其可见)或在此设备会话期间启动 activity 之前,无法从小部件启动服务?
因为现在当我按下按钮启动服务时没有任何反应,直到我至少启动应用程序一次
Android11 有什么方法可以检查我们是否可以从后台/小部件启动前台服务、摄像头等?如何确定用户在设备的当前会话中至少启动了一次 activity 的应用程序?
深入AndroidOS的源代码后,我发现了以下检查相机是否被限制的方法:
@RequiresApi(Build.VERSION_CODES.Q)
internal fun AppOpsManager.isCameraAllowedForPackage(packageName: String): Boolean {
val res = unsafeCheckOpNoThrow(
AppOpsManager.OPSTR_CAMERA,
android.os.Process.myUid(),
packageName
)
return res == AppOpsManager.MODE_ALLOWED
}
根据@CommonsWare 的评论,我需要使用 PendingIntent.getForegroundService()
而不是 PendingIntent.getService()
val startServiceIntent = TestService.getServiceIntent(context).let {
PendingIntent.getService(context, 0, it, PendingIntent.FLAG_UPDATE_CURRENT)
}
val views = RemoteViews(context.packageName, R.layout.layout_app_widget).apply {
setOnClickPendingIntent(R.id.start_service_btn, startServiceIntent) // doesn't work on boot device
setOnClickPendingIntent(R.id.start_activity_btn, startActivityIntent) // works fine
}
appWidgetManager.updateAppWidget(appWidgetId, views)
如何对待这种行为?我怎样才能至少向用户显示一条消息,即在他启动应用程序(使其可见)或在此设备会话期间启动 activity 之前,无法从小部件启动服务?
因为现在当我按下按钮启动服务时没有任何反应,直到我至少启动应用程序一次
Android11 有什么方法可以检查我们是否可以从后台/小部件启动前台服务、摄像头等?如何确定用户在设备的当前会话中至少启动了一次 activity 的应用程序?
深入AndroidOS的源代码后,我发现了以下检查相机是否被限制的方法:
@RequiresApi(Build.VERSION_CODES.Q)
internal fun AppOpsManager.isCameraAllowedForPackage(packageName: String): Boolean {
val res = unsafeCheckOpNoThrow(
AppOpsManager.OPSTR_CAMERA,
android.os.Process.myUid(),
packageName
)
return res == AppOpsManager.MODE_ALLOWED
}
根据@CommonsWare 的评论,我需要使用 PendingIntent.getForegroundService()
而不是 PendingIntent.getService()