从Android Q中的接收器开始活动

时间:2019-08-14 11:25:34

标签: android android-activity broadcastreceiver start-activity

我正在用Android Q [beta 6]检查我的应用程序,以便添加所有必需的更改以与上一个SO完全兼容。但是,我发现我正在使用Receiver从后台启动活动,由于最后实施的后台限制(https://developer.android.com/preview/privacy/background-activity-starts),该活动未打开。

我试图同时使用接收者上下文和应用程序上下文来开始活动,但是在两种情况下,系统都显示了一个吐司,说不可能从后台开始活动。

我在接收器上尝试过的操作...

class MyReceiver : BroadcastReceiver() {

    override fun onReceive(context: Context?, intent: Intent?) {
        context?.applicationContext?.let {
            it.startActivity(Intent(it, MyActivity::class.java).apply {
                addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
            })
            PushUtils.showReceiverCalledNotification(it)
        }
    }

这样,我想启动MyActivity并在调用接收方时也显示一条通知。相反,我可以看到通知,但活动从未启动。对于该功能而言,立即开始活动非常重要,因此有一种方法可以从接收者处继续开始活动吗?

2 个答案:

答案 0 :(得分:3)

  

该功能立即开始活动非常重要,因此有一种方法可以从接收者处继续开始活动吗?

不,对不起。使用高优先级通知,因此它以“平视”模式显示。然后,用户可以快速点击它以显示您的活动。

答案 1 :(得分:2)

由于限制,您不能从后台开始活动。相反,您可以使用CommonsWare建议的通知,也可以在android开发人员网站上建议使用通知。

您可以使用以下内容:

class MyReceiver : BroadcastReceiver() {
    override fun onReceive(context: Context?, intent: Intent?) {
        context ?: return
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
            showNotification(context.applicationContext)
        } else {
            context.applicationContext.startActivity(Intent(context, MyActivity::class.java).apply {
                addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
            })
        }
        PushUtils.showReceiverCalledNotification(context)

    }

    private fun showNotification(context: Context) {
        val manager = context.getSystemService(Context.NOTIFICATION_SERVICE) as? NotificationManager ?: return
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            val channel = NotificationChannel("default", "default", NotificationManager.IMPORTANCE_DEFAULT)
            manager.createNotificationChannel(channel)
        }

        val intent = Intent(context, MyActivity::class.java).apply {
            addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
        }

        val pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_ONE_SHOT)

        with(NotificationCompat.Builder(context, "default")) {
            setSmallIcon(R.drawable.ic_scan_colored)
            setContentTitle("Custom Title")
            setContentText("Tap to start the application")
            setContentIntent(pendingIntent)
            setAutoCancel(true)
            manager.notify(87, build())
        }
    }
}