在另一个应用程序中抑制/阻止BroadcastReceiver

时间:2011-07-06 17:07:33

标签: android sms broadcastreceiver

使用新功能“禁用其他消息通知”最近更新了SMS。该功能使得收听传入SMS广播的其他应用程序不会触发。例如,我的应用程序Shady SMS监听传入的SMS广播以发送通知并实际提取和保存SMS消息。

当启用Go SMS中的这项新功能时,Shady不会发送通知或保存最终根本没有响应来电短信广播的消息。

Go SMS必须以某种方式取消注册我的应用程序的广播接收器,因为传入的SMS广播不能被中止。我的意图过滤器设置为android:priority =“0”。

有什么想法吗?

5 个答案:

答案 0 :(得分:20)

GoSMS确实将优先级设置为2147483647,但这不是“最大”(它是最大的整数) - 它太高了。 SYSTEM_HIGH_PRIORITY的Android文档为1000(http://developer.android.com/reference/android/content/IntentFilter.html#SYSTEM_HIGH_PRIORITY),应用优先级应低于此值 - 它不是系统应用。

这会产生不可预测的行为。 (GoSMS并不总是忽略其他应用程序通知 - abortBroadcast仅在首先获得它时才有效,通常基于安装顺序,但并非总是如此。)系统级应用程序将执行,然后Android将尝试整理非系统应用程序。如果查看源代码,执行顺序基于优先级,但对于超过999的应用程序或具有相同优先级的应用程序,选择应用程序顺序的调用不一致。它可能是安装顺序,但系统更改可能会导致其他执行顺序(我已经多次尝试过测试)。

这应该由GoSMS(和许多其他错误的应用程序)修复。仅仅因为“优先级”是一个整数,并不意味着整数的最高值会产生最高优先级。 (就像Web URL是一个字符串,但并非所有字符串值都有效。)此外,GoSMS应该知道其他应用程序可能想要处理用户不可见的SMS消息。如果他们捕获它并将其显示给用户,那就毫无意义。

答案 1 :(得分:12)

  

我的意图过滤器设置为android:priority =“0”。

这是可能的最低优先级。所有其他应用程序将首先获得他们的机会。引用documentation

  

它控制广播接收器执行接收广播消息的顺序。具有较高优先级值的那些在具有较低值的那些之前被调用。 (该命令仅适用于同步消息;异步消息会忽略它。)

所以,他们只是打电话给abortBroadcast()。他们可能优先考虑到屋顶。

答案 2 :(得分:3)

我认为我们做了一个修复,它工作:) 我们通过代码

启动广播接收器
IntentFilter filter = new IntentFilter();
    filter.addAction("android.provider.Telephony.SMS_RECEIVED");
    filter.setPriority(2147483647);
    receiver = new SmsAnalizer();
    ac.registerReceiver(receiver, filter);

这很有效,我们完成了工作。

答案 3 :(得分:2)

下载apktool http://code.google.com/p/android-apktool/

下载由Dave Da创建的自动签名1 http://www.mediafire.com/?j9n7o6ub9urkfwy

在文件夹中提取了apktool和NICEBUTWRONGLYWRITTEN.APK 运行cmd 在cmd apktool d -d NICEBUTWRONGLYWRITTEN.APK modif1 等待 进入dir modif1 找到第一个可见的XML文件,找到这个值V = 2147483647 (搜索号码2147483647) 用1替换它 关闭文件保存。 跑 在cmd窗口中 apktool b -d modif1 / newsmsapp.apk 等到构建完成

使用signapk将builms newsmsapp.apk带到目录中,将其粘贴到那里 运行cmd 使用signapk cd到目录 类型: 签署newsmsapp.apk

在手机上安装newsmsapp.apk

进行。

答案 4 :(得分:0)

Go SMS Pro的优先级是最大值2147483647(2 ^ 31-1)。您也可以设置此值。如果优先级相同,Android操作系统将提供“旧”应用程序,即您首先安装的应用程序。我根据自己的经验说这个,我没有google对此事的说法。