当 phone 被锁定时从服务启动 activity Android 9.0(饼图)

Starting activity from Service when phone is locked Android 9.0(Pie)

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

我试过这个:

  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);
    }

我尝试在清单中向 activity 添加标志,但没有成功。我也试着把它放在 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
 }

更新:

我设法解决了这个 issue.Alex 答案是正确的,但小米设备在我需要启用的设置中有选项 "Show on Lock screen"。这是我对 Android OS.

感到有点沮丧的原因之一

还通过在 if 语句中添加此请求(在 setTurnScreenOn(true); ):

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

在 activity 的 onCreate() 中,您需要进行这些更改。 这里的activity显示一个红色的空activity即使设备被锁定

public class LockScreenActivity extends AppCompatActivity {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        //modify window flags so as to display it on lock screen
        Window window = getWindow();
        window.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
                | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
                | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

        // to wake up screen
        PowerManager pm = (PowerManager) getApplicationContext().getSystemService(Context.POWER_SERVICE);
        int wakeFlags = PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP;
        if (Build.VERSION.SDK_INT <= 15) {
            wakeFlags |= PowerManager.SCREEN_BRIGHT_WAKE_LOCK;
        }

        PowerManager.WakeLock wakeLock = pm.newWakeLock(wakeFlags, "MyApp:Call");
        wakeLock.acquire(30000); //wakelock for 30 sec

        View view = new View(this);
        view.setBackgroundColor(Color.RED);
        setContentView(view);
    }

}

记得在清单中添加WAKE_LOCK权限。