当前位置: 首页 > 知识库问答 >
问题:

使用AlarmManager时后台活动被阻止。(Android Q隐私更改)

从光启
2023-03-14

在我的项目中,我使用AlarmManager来触发每日闹钟,但当开始闹钟时,会出现以下toast消息:

Background activity start from com.example.nameOfApp blocked. See g.co/dev/bgblock

更新代码:

-------设置AlarmClock方法-------

private void setAlarmClock(Calendar calendar, int alarmId, String time, String timeOfTheDay, boolean action) {
        AlarmManager manager = (AlarmManager) getActivity().getSystemService(Context.ALARM_SERVICE);
        Intent intent = new Intent(getActivity(), AlarmClockReceiver.class);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(getActivity(), alarmId, intent, 0);

        if (action) {
            manager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
                    AlarmManager.INTERVAL_DAY, pendingIntent);
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                manager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
            }
        } else {
            manager.cancel(pendingIntent);
        }
    }

-------警报时钟接收器类-------

public class AlarmClockReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String alarmAction = AlarmClock.ACTION_SET_ALARM;
        Intent i = new Intent(alarmAction);
        i.putExtra(AlarmClock.EXTRA_SKIP_UI, true);
        i.putExtra(AlarmClock.EXTRA_MESSAGE, "Time for taking medicine!");
        i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(i);
    }
}

此外,在AndroidManifest我包括以下行:

<uses-permission android:name="com.android.alarm.permission.SET_ALARM"/>

我知道这与新的Android Q隐私更改有关。从上述链接可以看出:

在Android Q上运行的应用程序只有在满足以下一个或多个条件时才能启动活动:

...

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

如果我理解正确的话,这正是我的情况。尽管如此,还是出现了上述toast消息。

共有1个答案

东郭鹤龄
2023-03-14

只有在使用方法setContentIntent在通知中设置意图时,PendingContent才有效(以便启动活动)。因此,您可以做的是发布通知,而不是直接启动活动。当用户点击通知时,挂起的意图将用于启动活动。编辑:作为替代方案,您需要请求SYSTEM\u ALERT\u窗口权限,但您将无法在Android Go上执行应用程序,因为无法在该版本上使用此权限。

 类似资料:
  • 当应用程序处于活动状态时,所有操作都正常运行,但当没有任何活动运行时,我仍然通过firebase notification获得一个带有app_name和Body的通知,并打开MainActivity。 这是我的MyFirebaseMessagingService类:- 我看到了一个类似的问题,但对我的情况没有帮助。

  • 乍一看,我试图做一些相当简单的事情,但我做不到。我有一个按钮和两个隐藏的div。按下按钮时,我希望第一个div显示,n秒后隐藏,然后第二个div显示。 HTML: 包含JS的完整代码如下所示:https://jsfiddle.net/439xbfe5/ 我已经在这里检查了答案:jQuery显示5秒钟,然后隐藏 这个代码的问题是#div2在#div1消失之前出现: 同样的问题: 我还尝试创建一个阻塞

  • 我正在制作一个应用程序,使用ActivityRecognition API跟踪用户在后台的活动,如果用户在指定的时间段(例如1小时)内保持在同一位置,则系统会推送通知,告诉用户散步。我已经实现了活动识别,但仅适用于打开应用程序的情况。显然,Google API客户端需要保持连接才能发送活动更新。我的问题是-对于后台活动跟踪,什么是更好的解决方案: 1)在主活动(或单独活动)中实现警报管理器,该活动

  • 我有一个小的vertx应用程序。一个超文本传输协议垂直获取一个请求,并通过带有请求-响应模式的eventbus发送它。所以类似于: 在DB Vertical中,我使用消费者获取一条消息,发送到DB,进行一些更改并发送回HTTP verticle。我的问题是,我有一个必须进行大量检查的删除操作,所以这个过程可能需要10秒钟。此时HTTP verticle仍然可以获得一些新请求,但DB consume

  • 我有一个使用新工具栏的活动。在这个工具栏中,我只有一个图标...我的搜索视图图标。当我单击该图标时,它会在工具栏中打开一个EditText,并且能够写下我想要的东西。问题是,当我单击“搜索”图标时,我的活动(带有片段的帧布局)的内容被重新加载。 编辑: 另外:当单击图标时,它会重新加载活动并打开EditText,然后调用activity SearchResult,如果我在该活动中按后退按钮,我会返

  • 我正在处理活动识别API,试图使其在后台运行。因此,我创建了一个连接到Play Services的服务,并且一直处于活动状态。当服务被销毁并重新创建时,我要干杯了。问题是,一段时间后,即使服务正在运行,它也会停止检测活动。 下面是该服务的一些代码。 我还覆盖了onConnectionSuspend 这段代码正常工作了一段时间,然后突然停止了。有人知道为什么吗? 谢谢。