首页 > 解决方案 > 手机锁定时从服务启动活动 Android 9.0(Pie)

问题描述

您好,我正在为该应用程序开发 VoIP 功能,并且我正在尝试处理应用程序被终止时的情况。我的想法是使用 FCM 通知并运行将显示用户来电屏幕的活动。它在手机解锁时按预期工作,但在手机锁定时则不然。

我试过这个:

  if (Build.VERSION.SDK_INT > Build.VERSION_CODES.O_MR1) {
      setShowWhenLocked(true);
      setTurnScreenOn(true);
    }else{
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
    }

我尝试将标志添加到清单中的活动,但没有运气。我还尝试将它放在 super.onCreate() 之前 super.onCreate() 之后以及 setContentView() 之后,但没有运气。

我只想要与 Viber 和 WhatsApp 相同的行为。但目前我不知道他们是如何做到的。

我用最新更新在 PocoPhone F1 上测试了上面的代码。

编辑

这是 FirebaseMessagingService 的一部分,我在其中接收和处理推送通知

public class NotificationService extends FirebaseMessagingService {
  private static final String TYPE = "type";
  private static final String VIDEO_CALL = "video_call";

  @Override public void onMessageReceived(RemoteMessage remoteMessage){
       Map<String,String> data = remoteMessage.getData();

       if(data.containsKey(TYPE) && data.get(TYPE).equals(VIDEO_CALL)){
        Intent videoCallIntent = new Intent(this, VideoCallActivity.class);
        videoCallIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(videoCallIntent);
       }
  }

}

这是推送通知有效负载

{
    "to": "...",
    "data" : {
     "type" : "video_call"
     },
    "priority":"high",
    "ttl": 3600
 }

更新:

我设法解决了这个问题。Alex 的答案是正确的,但小米设备在我需要启用的设置中有“在锁定屏幕上显示”选项。这是我对 Android OS 有点失望的原因之一。

标签: androidandroid-9.0-pieandroid-background

解决方案


还通过在 if 语句中添加此请求(在 之后)请求KEYGUARD_SERVICEsetTurnScreenOn(true);以解除更高的 API 级别:

    KeyguardManager keyguardManager = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
    if (keyguardManager!= null) {
        keyguardManager.requestDismissKeyguard(this, null);
    }

推荐阅读