【问题标题】:Launch Activity from FCM从 FCM 启动活动
【发布时间】:2018-05-18 13:28:57
【问题描述】:

在我的应用程序中,当收到高优先级 FCM 消息时,我需要启动一个活动并打开屏幕。这是一个警报活动,对用户来说非常非常重要。 在大多数 Android 设备上,代码运行良好。但是,在某些华为或 LG 设备上,当设备处于打盹模式或放在口袋(接近传感器)时,活动不会启动。行为应该类似于闹钟、电话等。 这是我的代码:

FirebaseMessagingService:

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
     Intent dialogIntent = new Intent(getBaseContext(), AlarmActivity.class);
     dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
     dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
     dialogIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
     dialogIntent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
     getApplication().startActivity(dialogIntent);
}

报警活动:

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

    // set flags so an activity fire on the screen
    getWindow().addFlags(
            WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD |
                    WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON |
                    WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED |
                    WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
    );

    setContentView(R.layout.activity_alarm);
    .
    .
}

我想在启动活动之前使用SCREEN_BRIGHT_WAKE_LOCK,但它已被弃用。

【问题讨论】:

  • 查看系统是否在 LogCat 中记录与您的活动启动失败相关的任何消息。或者,建议用户将您的应用添加到电池优化白名单中。
  • 电池优化白名单没有帮助。我将尝试获取无法正常工作的设备。用户报告了此问题,在我的调试设备上运行良好。

标签: android firebase firebase-cloud-messaging android-doze


【解决方案1】:

我在我的活动中使用此代码:

@Override
protected void onCreate(Bundle savedInstanceState) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                    setShowWhenLocked(true);
                    setTurnScreenOn(true);
                    KeyguardManager keyguardManager = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
                    if (keyguardManager != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                        keyguardManager.requestDismissKeyguard(this, null);
                    }
                } else {
                    //noinspection deprecation
                    getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD |
                            WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED |
                            WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
                    );
                }
    }
    .....
}

为了防止在我的活动布局中使用的不同设备上出现不同的行为:

<android.support.design.widget.CoordinatorLayout
    ....
    android:keepScreenOn="true"
    >

【讨论】:

  • 您的代码运行可靠吗?这些问题是在 Android N 上报告的,因此唯一的区别是在布局资源中使用了 keepScreenOn 属性。
  • 你注意到 setShowWhenLocked(true); setTurnScreenOn(true);方法。我已经在几个 SDK 上对其进行了测试,并且可以正常工作
  • 这些是 Android O 提供的方法。在发生问题的 Android N 上,您使用相同的标志。不过,感谢您的回复,我会将其添加到我的代码中以更好地定位奥利奥。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多