前台服务不启动活动

Posted

技术标签:

【中文标题】前台服务不启动活动【英文标题】:Foreground service doesn't start activity 【发布时间】:2021-09-15 04:39:03 【问题描述】:

即使应用程序被终止,我也想启动一个活动。低于 API 29 没有问题,但高于 29 即使在后台触发服务 startActivity 也不起作用。

这是我的服务类

class MyService : Service() 

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


override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int 


    if (Build.VERSION.SDK_INT >= 26) 
        val channel = NotificationChannel(
            CHANNEL_ID,
            CHANNEL_NAME,
            NotificationManager.IMPORTANCE_DEFAULT
        )
        val manager = getSystemService(NotificationManager::class.java)
        manager.createNotificationChannel(channel)
    

    val notificationBuilder = NotificationCompat.Builder(this, CHANNEL_ID)
        .setContentTitle("setContentTitle")
        .setContentText("setContentText")
        .build()


    val mIntent = Intent(applicationContext, MyActivity::class.java)
    mIntent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
    startActivity(mIntent)

    startForeground(NOTIFICATION_ID, notificationBuilder)

    return START_NOT_STICKY





companion object 
    const val CHANNEL_ID = "channel_id"
    const val NOTIFICATION_ID = 5
    const val CHANNEL_NAME = "channel_name"

在清单中我添加了 FOREGROUND_SERVICE 权限

 <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />

<service android:name=".service.MyService" />
<receiver android:name=".receiver.MyReceiver" />

这是我的接收器类,API 29 以上我想启动一个服务

class MyReceiver : BroadcastReceiver() 


override fun onReceive(context: Context?, intent: Intent?) 

    intent?.let 
        if (Build.VERSION.SDK_INT >= 29) 
            context?.startForegroundService(Intent(context, MyService::class.java))
         else 
            val intentActivity = Intent(context, MyActivity::class.java)
            intentActivity.flags = Intent.FLAG_ACTIVITY_NEW_TASK
            context?.startActivity(intentActivity)
        
    



【问题讨论】:

developer.android.com/guide/components/activities/… 那么,onReceive() 被触发并启动了前台服务? 【参考方案1】:

您可以在这里使用 PendingIntent。

PendingIntent 是一个稍后将执行的意图,或者换句话说,PendingIntent 指定了将来要执行的操作。 pendingIntent 和常规 Intent 之间的主要区别在于,pendingIntent 将在稍后立即执行 Normal/Regular Intent 时执行。

它带有像这样的不同用例。

PendingIntent.getActivity() — 这将启动一个 Activity,例如调用 context.startActivity() PendingIntent.getBroadcast() — 这将执行广播,如调用 context.sendBroadcast() PendingIntent.getService() — 这将启动一个服务,例如调用 context.startService() PendingIntent.getForegroundService() — 这将启动一个前台服务,例如调用 context.startForegroundService()

您可以在互联网上找到大量关于它的示例。只需谷歌它,它会让你完成工作。 :)

【讨论】:

但是我不希望它在以后启动,它应该立即启动。

以上是关于前台服务不启动活动的主要内容,如果未能解决你的问题,请参考以下文章

Android 活动和前台服务 - 一般问题

前台服务内容意图不是恢复应用程序而是重新启动它

在活动处于前台时接收明确的意图

Android中的前台通知启动新的活动(通过pendingIntent)而不是现有的

当用户滑开时前台服务被终止

获取服务中前台活动的上下文