首页 > 解决方案 > 无法从 API R 中的 BroadcastReceiver 类启动Activity(上下文,意图)(android studio)

问题描述

(在您将此问题标记为重复之前,请注意我在特定的 API 级别 (API R) 中遇到了这个问题,该应用程序在低于 R 的其他 API 级别上显示正常的预期工作行为)。

在 Pixed 3a 上运行应用程序时,API R 我正在通过构建一个基本的警报应用程序来尝试 android 中的警报管理器。我有一个 AlarmPageActivity,我试图从我的自定义广播接收器 ( AlarmReceiver.java) 开始我的 MainActivity 中有代码,我在其中使用警报管理器设置警报。当警报响起时,挂起的意图会转到AlarmReceiver我尝试使用context.startActivity(context, alarmIntent).

问题: [在你去那里之前,是的,我有适当的标志(Intent.FLAG_ACTIVITY_NEW_TASK)]。当我设置闹钟时间并保持应用程序打开时,AlarmPageActivity(应该在闹钟响起时弹出打开的活动)启动并且应用程序执行正常行为。但是当我设置时间并关闭应用onDestroy()程序AlarmReceiver.javaonCreate()它也不会在“日志/运行”窗口中显示任何错误。我尝试更改从挂起的意图参数到向意图对象添加新的活动标志等所有内容,但没有任何效果!您可以在下面的代码中看到不存在应该阻止代码通过广播接收器启动新活动的语法错误(当用户在应用程序之外时)。

我面对这个问题将近2天。我阅读了互联网上关于从广播接收器类开始活动的每篇文章/帖子。但它不起作用,我很沮丧。然后奇迹般地,我想为什么不尝试在不同的模拟器上运行该应用程序。你猜怎么着?有效。 sigh...我一直在想我做错了什么,或者我的代码很糟糕,因为我在 android studio 中只是初学者。但我几乎不知道,我的代码一直都是正确的。

在 Pixed 3a 上运行应用程序时API 26 应用程序显示正常的预期行为。即使在 onDestroy() 之后,BroadCast 接收器也会接收并启动带有铃声的 AlarmPageActivity :)

我的问题:这是在运行 API R 的模拟器设备上不起作用的相同代码(我没有更改/添加任何其他内容),但现在在 API 26 中有效。有人可以解释为什么它不起作用吗?我真的很感激。或者也许我的代码在某种程度上与 API R 不兼容......谁知道呢?开导我!

MainActivity.java

protected void onCreate(Bundle savedInstanceState) {

    ...
    other code...
    ...

    // Alarm manager code ----------------------------------------
    alarmMgr = (AlarmManager) getSystemService(ALARM_SERVICE);

    Calendar calendar = Calendar.getInstance();
    calendar.setTimeInMillis(System.currentTimeMillis());

    calendar.set(Calendar.HOUR_OF_DAY, 0);
    calendar.set(Calendar.MINUTE, 56);
    calendar.set(Calendar.SECOND, 0);
    long startTime = calendar.getTimeInMillis();

    Intent alarmIntent = new Intent(this, AlarmReceiver.class);
    final PendingIntent alarmPendingIntent = PendingIntent.getBroadcast(this, 0,
            alarmIntent, 0);

    alarmMgr.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, startTime, alarmPendingIntent);
}

报警接收器.java

public class AlarmReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent){
    // TODO: This method is called when the BroadcastReceiver is receiving
    // an Intent broadcast.
    Log.d("asdfasdf", "BroadcastReceiver (alarmReceiver) activity reached");

    Intent alarmIntent = new Intent(context.getApplicationContext(), AlarmPageActivity.class);

    alarmIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    context.startActivity(alarmIntent);

    alarmUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);
    // ringtone code ...
    ringtone.play();

    Log.d("asdfasdf", "Reached end of alarmReceiver "); 
}
} // mind the wrong indenting here

AlarmPageActivity.java

has the default empty activity code...

是的,我知道我不应该从广播接收器运行活动,因为它不应该执行需要 10 秒以上的繁重任务,但我只是想在以后改进该代码之前看看它会是什么样子。

标签: javaandroidandroid-studio

解决方案


我认为它不适用于 android 10 及更高版本。请阅读有关从后台启动活动的限制的更多详细信息。尝试SYSTEM_ALERT_WINDOW为此案例请求许可


推荐阅读