从 Android Q 中的接收器启动活动

Posted

技术标签:

【中文标题】从 Android Q 中的接收器启动活动【英文标题】:Start activity from receiver in Android Q 【发布时间】:2019-12-20 22:57:15 【问题描述】:

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

我尝试同时使用接收器上下文和应用程序上下文来启动活动,但在这两种情况下,系统都会显示一个 toast 表示无法从后台启动活动。

我在接收器上尝试了什么...

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 并在调用接收器时显示通知。相反,我可以看到通知,但 Activity 从未启动。立即启动activity的特性非常重要,那么有没有办法从receiver继续启动activity呢?

【问题讨论】:

您是否尝试了SYSTEM_ALERT_WINDOW 权限? 是的。调用 startActivity 时同样的问题。 【参考方案1】:

立即启动activity对于特性来说非常重要,那么有没有办法从receiver继续启动activity呢?

不,对不起。使用高优先级通知,使其以“提醒”模式显示。然后,用户可以快速点击它来调出您的活动。

【讨论】:

我最终使用了高优先级的全屏通知,然后即使屏幕被锁定,它也会显示。 @commonsware 以及警报/提醒应用程序如何,这些应用程序绝对必须从后台启动活动才能播放警报?通知在这里并不是真正的解决方案 @qkx:如果在发出通知时显示器关闭,则抬头通知将直接显示活动(通过“全屏Intent”)。如果显示器打开,提示通知会显示气泡几秒钟,因为用户正在使用设备,打断他们正在做的事情可能不安全。 从documentation看来,如果用户授予“显示在其他应用程序之上”的权限,该应用程序将不受限制。 您好@AdesuyiAyodeji,由于新的背景限制,我无法打开活动,但我可以执行的是构建一个全屏通知,其工作方式与发布在 cmets 上的 CommonsWare 完全相同。我按照以下步骤操作:***.com/questions/37679266/fullscreen-notification/… 对我来说已经足够了......【参考方案2】:

由于限制,您无法从后台启动活动。相反,您可以按照 CommonsWare 的建议和 android 开发者网站上的建议使用通知。

这里是官方文档,列出了什么时候可以工作,什么时候不可以。

https://developer.android.com/guide/components/activities/background-starts

你可以这样使用:

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())
        
    

【讨论】:

非常感谢示例代码。是的,由于新的限制,我认为这是最好的选择(如果没有可能重现当前行为,我想这样做是一样的)。 但是 whatsapp 是如何工作的。我的应用关闭时接到电话? 想一想,如何从通知中显示 SMS 弹出窗口?!! @RahulGiradkar 你有没有找到像whatsapp这样的替代方法? @SARATHV 不,我没有找到任何替代方案。

以上是关于从 Android Q 中的接收器启动活动的主要内容,如果未能解决你的问题,请参考以下文章

在不启动接收活动的情况下将数据传递给活动 (Android)

IBM MobileFirst:如何让应用程序接收任何活动的推送通知

Android核心组件 Activity组件

即使屏幕在Android中被锁定,也会启动活动屏幕

全屏意图未启动活动,但确实在 android 10 上显示通知

从广播接收器android调用活动方法?