gpt4 book ai didi

android - 谁能提供一个将生成 ForegroundServiceStartNotAllowedException 的示例?

转载 作者:行者123 更新时间:2023-12-04 23:49:49 24 4
gpt4 key购买 nike

Android 12 增加了对从某些后台任务启动的 ForegroundService 的限制。我有一个使用多个 ForegroundServices 的应用程序,其中一些不在异常(exception)情况下。但是,针对 API 31 的构建在 Android 12 Beta 4 设备上运行时没有遇到任何问题或 ForegroundServiceStartNotAllowedException。
任何人都可以提供一个示例来在构建目标 API 31 后遇到问题吗?

最佳答案

在毕业典礼上:

compileSdkVersion 31
buildToolsVersion "31.0.0"
targetSdkVersion 31
在 list 中:
 <service android:name=".MyForegroundService"
android:exported="false"/>

<service android:name=".MyService"
android:exported="false"/>

<receiver android:name=".MyBroadcastReceiver"
android:exported="true">
<intent-filter>
<action android:name="com.sdk12.foreground.ACTION"/>
</intent-filter>
</receiver>
接收者:
class MyBroadcastReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
Log.d("tag", "onReceive()");
val myServiceIntent = Intent(context, MyForegroundService::class.java)
Handler(Looper.getMainLooper()).postDelayed({
try {
ContextCompat.startForegroundService(context,myServiceIntent)
} catch (ex : ForegroundServiceStartNotAllowedException){
Log.d("tag","ForegroundServiceStartNotAllowedException")
}
}, 5000)
}
}
前台服务:
class MyForegroundService : Service() {
private lateinit var br: BroadcastReceiver

override fun onBind(intent: Intent): IBinder? {
return null
}

override fun onCreate() {
super.onCreate()
br = MyBroadcastReceiver()
val filter = IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION).apply {
addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED)
}
registerReceiver(br, filter)

}

override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int {
val channelId = createNotificationChannel("channel1","My Background Service")

val pendingIntent: PendingIntent =
Intent(this, MainActivity::class.java).let { notificationIntent ->
PendingIntent.getActivity(this, 0, notificationIntent, PendingIntent.FLAG_MUTABLE)
}

val notificationBuilder = Notification.Builder(this, channelId )
val notification = notificationBuilder.setOngoing(true)
.setSmallIcon(R.mipmap.ic_launcher)
.setContentTitle("title")
.setContentText("contentText")
.setCategory(Notification.CATEGORY_SERVICE)
.setContentIntent(pendingIntent)
.setForegroundServiceBehavior(Notification.FOREGROUND_SERVICE_IMMEDIATE)
.build()

startForeground(1, notification)

return START_STICKY

}

override fun onDestroy() {
unregisterReceiver(br)
super.onDestroy()
}

private fun createNotificationChannel(channelId: String, channelName: String): String {
val chan = NotificationChannel(
"channel1",
channelName, NotificationManager.IMPORTANCE_NONE
)
chan.lightColor = Color.BLUE
chan.lockscreenVisibility = Notification.VISIBILITY_PRIVATE
chan.importance = NotificationManager.IMPORTANCE_HIGH
val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
notificationManager.createNotificationChannel(chan)
return channelId
}
}
我的服务:
class MyService : Service() {
private lateinit var br: BroadcastReceiver

override fun onBind(intent: Intent): IBinder? {
return null
}

override fun onCreate() {
super.onCreate()
br = MyBroadcastReceiver()
val filter = IntentFilter("com.sdk12.foreground.ACTION")
registerReceiver(br, filter)

}

override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int {
return START_STICKY
}

override fun onDestroy() {
unregisterReceiver(br)
super.onDestroy()
}
}
触发服务:
startService(Intent(this, MyService::class.java))
将您的应用程序发送到后台并从 adb 调用:
adb shell am broadcast -a com.sdk12.foreground.ACTION -f 0x01000000
这将确保您在后台
可能有更简单的方法,但我觉得这最容易理解

关于android - 谁能提供一个将生成 ForegroundServiceStartNotAllowedException 的示例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68777762/

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