应用程序未运行时广播接收器不起作用
Posted
技术标签:
【中文标题】应用程序未运行时广播接收器不起作用【英文标题】:BroadcastReceiver not working when app is not running 【发布时间】:2013-04-29 23:51:09 【问题描述】:在我的清单文件中,我已经声明了接收者。 (如下)
<receiver android:name=".OnAlarmReceive" />
但是,一旦我关闭了我的应用程序,我就无法获得警报和通知。显然,我的Broadcast receiver
中的OnReceive
从未被调用过。
public class OnAlarmReceive extends BroadcastReceiver
@Override
public void onReceive(Context context, Intent arg1)
//various stuff
在 MainActivity 中,我的报警管理器类如下。
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
Intent intent = new Intent("MY_ALARM_NOTIFICATION");
intent.setClass(this, OnAlarmReceive.class);
intent.putExtra("message", message);
PendingIntent pendingIntent = PendingIntent
.getBroadcast(MainActivity.this, 0, intent,
PendingIntent.FLAG_UPDATE_CURRENT);
Calendar timeCal = Calendar.getInstance();
timeCal.set(Calendar.HOUR_OF_DAY, hour);
timeCal.set(Calendar.MINUTE, minutes);
alarmManager.set(AlarmManager.RTC_WAKEUP, timeCal.getTimeInMillis(), pendingIntent);
我的清单如下:
<receiver android:name=".OnAlarmReceive">
<intent-filter android:priority="1">
<action android:name="MY_ALARM_NOTIFICATION"/>
</intent-filter>
</receiver>
即使我关闭了我的应用程序,我应该怎么做才能接收通知/警报。后台服务?
【问题讨论】:
请检查***.com/questions/16824341/…和github.com/twilio/voice-quickstart-android/issues/150 【参考方案1】:你应该在清单中添加意图过滤器
receiver android:name=".SmsBroadCastReceiver">
<intent-filter android:priority="20">
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>
【讨论】:
报警接收也一样吗?因为你给的是短信【参考方案2】:正如龚聪所说,你需要声明你的接收者应该监听哪些事件。
例如:
<receiver android:name=".OnAlarmReceive">
<intent-filter>
<action android:name="MY_ALARM_NOTIFICATION"/>
</intent-filter> </receiver>
然后当你设置你的闹钟时,在你的行动中使用一个意图:
Intent intent = new Intent("MY_ALARM_NOTIFICATION");
intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
PendingIntent pi = PendingIntent.getBroadcast( this, 0, intent, 0 );
【讨论】:
我做到了。但是,一旦我关闭我的活动,警报就不会响起。使用运行上述代码的应用程序(即使在我的更改之后)工作。但是当我删除应用程序(从任务管理器)时,它并没有运行。 你能发布你的代码的一部分吗?你是如何设置闹钟的?你使用 AlarmManager.RTC_WAKEUP 标志吗? 是的,但是像这样,我不能添加额外的意图,因为我没有调用带有意图的活动,而是清单中的广播接收器没有? 很奇怪,你的代码看起来很干净......这是你需要的完整示例,试试你项目中的代码wptrafficanalyzer.in/blog/… 我在某处读到,在 3.1 之后,如果您强制关闭应用程序,广播接收器将无法工作。【参考方案3】:您的代码运行良好!
你所要做的就是改变这一行:
alarmManager.set(AlarmManager.RTC_WAKEUP, timeCal.getTimeInMillis(),
pendingIntent);
用这一行:
alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,
SystemClock.elapsedRealtime() + 5000, pendingIntent);
即使应用没有运行,“onReceive”中的代码也会在 5000 毫秒(5 秒)后运行
【讨论】:
【参考方案4】:据我了解,在某些情况下,取决于实现方式,操作系统有权调整闹钟设置时间。因此,请尝试相应地使用 AlarmManager.set(...)、AlarmManager.setexact(...) 等。在某些情况下,取决于制造商(自定义 Android 操作系统),操作系统可能会阻止火警警报。
【讨论】:
【参考方案5】:在清单文件中为接收器添加android:exported="true"
有助于我接收警报(从而唤醒应用程序),即使应用程序已关闭(我故意从任务列表中删除应用程序)。
【讨论】:
【参考方案6】:1.在Manifest-file中声明接收者:
<receiver android:name="your.package.name.TestAlarmReceiver"></receiver>
永远记住整个 Android 系统是区分大小写的。因此,请检查您在 AndroidMainfest.xml 中的拼写是否正确。
2.如果您为接收者创建PendingIntent
,请添加requestCode
- 即使它是随机数!没有你的onReceive
代码永远不会被调用!
启动AlarmManager
的函数应该如下所示:
public static void scheduleTestAlarmReceiver(Context context)
Intent receiverIntent = new Intent(context, TestAlarmReceiver.class);
PendingIntent sender = PendingIntent.getBroadcast(context, 123456789, receiverIntent, 0);
AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime()+startDelay, someDelay, sender);
BroadcastReceiver 类:
package your.package.name;
public class TestAlarmReceiver extends BroadcastReceiver
@Override
public void onReceive(Context context, Intent arg1)
// your code here!
原文:Why my BroadcastReceiver does not get called?
【讨论】:
以上是关于应用程序未运行时广播接收器不起作用的主要内容,如果未能解决你的问题,请参考以下文章