我正在尝试使用广播接收器在 Android Q 中实现基于警报的应用程序。我正在运行使用通知来触发警报广播接收器的前台服务。该服务运行良好,并且正在触发广播接收器。如果我们在设置警报后关闭应用程序或锁定屏幕,则该服务将在前台运行并显示通知。
当警报广播被调用时,我试图在锁定屏幕时打开新的活动,以提供停止警报和服务的功能。我尝试禁用键盘锁,打开屏幕,然后从广播接收器中打开活动,但无法成功。
我尝试使用 WindowManager标志,但已弃用它们,并且在代码中没有任何区别。
WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
| WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
| WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
由于我尝试从BroadcastReceiver启动活动,因此我将没有任何活动可以使用 KeyguardManager.requestDismissKeyguard(活动活动,KeyguardDismissCallback回调)
锁定屏幕以关闭警报时,有什么方法可以开始活动。我的实现如下所示,
我还在清单文件中添加了权限。
AndroidManifest.xml
<uses-permission android:name="com.android.alarm.permission.SET_ALARM" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
AlarmBroadcastReceiver.class
public class AlarmBroadcastReceiver extends BroadcastReceiver {
public static MediaPlayer mp;
public static Vibrator vibrator;
private boolean isVibrationEnabled = false;
@Override
public void onReceive(Context context, Intent intent) {
long[] mVibratePattern = new long[]{0, 400, 400, 400, 400, 400, 400, 400};
final int[] mAmplitudes = new int[]{0, 128, 0, 128, 0, 128, 0, 128};
isVibrationEnabled = intent.getExtras().getBoolean(LocationAlertService.IS_VIBRATE);
mp=MediaPlayer.create(context, R.raw.ring1);
mp.setLooping(true);
mp.start();
if(isVibrationEnabled) {
vibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
vibrator.vibrate(VibrationEffect.createWaveform(mVibratePattern, mAmplitudes, 0));
} else {
//deprecated in API 26
vibrator.vibrate(mVibratePattern, 3);
}
}
Intent wakeIntent = new Intent(context, WakeUpActivity.class);
wakeIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(wakeIntent);
}
}
我知道我想念一些东西。如果有解决我所面临问题的任何建议,我将感到高兴。预先感谢您的帮助。
答案 0 :(得分:1)
使用Android Q,如果您的应用未包含下面链接中列出的那些例外,则无法从后台自动启动活动。您可以选择仅显示服务通知,然后单击以启动待定意向。
https://developer.android.com/guide/components/activities/background-starts
使系统正常工作。我认为最可能的解决方案是在清单文件中添加“ SYSTEM_ALERT_WINDOW”。并在应用程序首次打开时请求一次用户权限。(用户可以手动授予此权限-((设置-应用程序-您的应用程序-高级-绘制其他应用程序))示例代码以请求权限:
在清单中
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
应用中的某处:
private void RequestPermission() {
// Check if Android M or higher
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
// Show alert dialog to the user saying a separate permission is needed
// Launch the settings activity if the user prefers
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
Uri.parse("package:" + getActivity().getPackageName()));
startActivityForResult(intent, ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE);
}
}
@Override
public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (!Settings.canDrawOverlays(getContext())) {
PermissionDenied();
}
else
{
//Permission Granted-System will work
}
}
}