应用程序未运行时广播接收器不起作用

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?

【讨论】:

以上是关于应用程序未运行时广播接收器不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Toast 和广播接收器不起作用

地理围栏未触发(未决意图和广播接收器)

当手机处于睡眠模式时,为什么用于来电的广播接收器在棒棒糖上不起作用

Android中的广播接收器不起作用

应用程序未运行时,SMS 广播接收器不工作

广播接收器在 Android 8 的前台服务中不起作用