【问题标题】:sms broadcast receiver not triggering after one day短信广播接收器在一天后未触发
【发布时间】:2017-06-13 13:32:20
【问题描述】:

在我的应用程序中,每当我们收到消息时,都需要显示一个带有预填充消息的弹出窗口。为此,我在清单文件中使用了以下代码

 <receiver
        android:name="com.cte.broadcast.SMS_Receive_BroadCast"
        android:enabled="false">
        <intent-filter>
            <action android:name="android.provider.Telephony.SMS_RECEIVED" />
        </intent-filter>
    </receiver>

每当应用登录时,使用以下代码注册广播接收器

         ComponentName component = new ComponentName(getApplicationContext(),
                        SMS_Receive_BroadCast.class);
                getApplicationContext().getPackageManager().setComponentEnabledSetting(component,
                        PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
                        PackageManager.DONT_KILL_APP);

并且每当应用程序登录时,使用以下代码取消注册广播接收器

ComponentName component_sms = new ComponentName(context.getApplicationContext(),
                SMS_Receive_BroadCast.class);
        getApplicationContext().getPackageManager().setComponentEnabledSetting(component_sms,
                PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
                PackageManager.DONT_KILL_APP);

所以这里一切正常。当我们登录时,每当我们收到消息广播接收器触发并弹出甚至应用程序关闭时。并注销没有触发广播接收器并且没有弹出。所以到这一切都很好。但问题是一天之后,每当我们收到消息时,广播接收器即使已登录也不会触发。但是每当我们打开应用程序并关闭它时,它就会正常工作。所以问题是在一段时间后,我认为广播接收器会自动取消注册..

那么如何解决这个问题..提前谢谢..

【问题讨论】:

  • 您在什么设备上遇到此问题?
  • 所有设备都有问题
  • 您何时/在何处将组件设置为 DISABLED?
  • 我也不明白您为什么要启用和禁用您的接收器。您可以一直启用接收器,并忽略任何您不想操作的触发器。
  • 如果应用程序已注销,则只需注销接收器即可。如果它没有取消注册,那么总是触发广播接收器..它消耗电池电量并降低应用程序性能..

标签: android broadcastreceiver sms


【解决方案1】:

一些应用程序中止您的广播意图,这将阻止其他应用程序接收意图。

解决方法是在intent-filter标签中增加android:priority属性:

 <intent-filter android:priority="priority value">
            <action android:name="android.provider.Telephony.SMS_RECEIVED" />
 </intent-filter>

【讨论】:

  • 嗨,感谢您的快速回复。这里的优先级值是什么
  • @rams : 你可以给它500
  • 这毫无意义。如果它正常工作(通常),但在一段时间后不起作用,则其他应用程序极不可能阻止 OP 的应用程序看到广播 Intent
  • 我已经给出了广播接收器不工作的可能原因。 @rams:你在不同的设备上试过了吗?
【解决方案2】:

我也遇到过类似的问题。我不知道为什么,但取决于你把你的 registerBroadcast,android 会杀死那个实例,它与 linux 上的进程执行堆栈有关。 我做了什么来解决这个问题:创建一个后台服务而不是广播接收器,在那里你注册你的 BR,它会正常工作,几天 =)))!

【讨论】:

  • 谢谢你。为了您的回应..何时停止服务以及何时取消注册广播接收器..这里
  • 您可以随时停止服务。只需调用 stopService();要注册和注销broadcastReceiver,可以使用服务的生命周期,函数onCreate()和onDestroy()!
  • 非常感谢...这里开始服务的时间间隔是多少。表示像这样每 1 小时或 2 小时一次
  • 服务不会结束,直到您调用 stopService() 或终止应用程序!请为答案投票!
猜你喜欢
  • 1970-01-01
  • 2022-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-06
  • 1970-01-01
  • 2022-07-16
  • 1970-01-01
相关资源
最近更新 更多