首页 > 解决方案 > 当手机被锁定并且屏幕在 android 10 中关闭时,如何从 ForegroundService 打开活动?

问题描述

从我的问题中可以清楚地看出,我想从前台服务开始活动。在 android 5-9 中它会启动,但在 android 10 中有限制,我不知道该怎么做!

这是需要开始的活动:

public class Activity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_alarm_time);

        // Important: have to do the following in order to show without unlocking
        this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | 
            WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON,
            WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | 
            WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
    }
}

并表现:

<activity android:name=".Activity"
    android:showOnLockScreen="true"
    android:screenOrientation="portrait"
    android:autoRemoveFromRecents="true"
    android:excludeFromRecents="true"
/>

标签: android-activityserviceandroid-10.0foregroundscreen-lock

解决方案


从 android 10 开始,在大多数情况下,无法从后台服务打开您的活动,因为它们添加了许多限制以向用户提供更好的体验。

以下是限制的例外情况

该应用程序有一个可见窗口,例如前台的活动。该应用程序在前台任务的后台堆栈中有一个活动。该应用程序在“最近”屏幕上现有任务的后台堆栈中有一个活动。

该应用程序最近在一项活动上调用了 finish()。这仅适用于应用程序在调用 finish() 时在前台有一个活动或在前台任务的后台堆栈中有一个活动。

该应用程序具有受系统绑定的服务。此条件仅适用于可能需要启动 UI 的以下服务:AccessibilityService、AutofillService、CallRedirectionService、HostApduService、InCallService、TileService、VoiceInteractionService 和 VrListenerService。

该应用程序具有由不同的可见应用程序绑定的服务。请注意,绑定到服务的应用程序必须保持可见,以便后台应用程序成功启动活动。

应用程序从系统收到通知 PendingIntent。在服务和广播接收器的待处理意图的情况下,应用程序可以在发送待处理意图后的几秒钟内启动活动。

应用程序接收到从不同的可见应用程序发送的 PendingIntent。

应用程序接收系统广播,应用程序将在其中启动 UI。示例包括 ACTION_NEW_OUTGOING_CALL 和 SECRET_CODE_ACTION。该应用程序可以在广播发送后的几秒钟内启动活动。

该应用程序通过 CompanionDeviceManager API 与配套硬件设备相关联。此 API 允许应用程序启动活动以响应用户在配对设备上执行的操作。

该应用程序是在设备所有者模式下运行的设备策略控制器。示例用例包括完全托管的企业设备,以及数字标牌和信息亭等专用设备。

该应用已被用户授予 SYSTEM_ALERT_WINDOW 权限。

这是相同 的限制例外的参考链接


推荐阅读