出于某种原因,并不总是调用onReceive()
类的BroadcastReceiver
方法。它通常被称为,但有时它不是。
更具体地说,我收到了android.intent.action.PHONE_STATE
。大多数情况下,当调用进入时,onRecieve()
方法被调用,因为它应该用于更改RINGING,IDLE和OFFHOOK。但是,在某些情况下,该方法不会被调用RINGING(当一个呼叫进入时),但仍然会调用IDLE(当我挂断呼叫时)。
来自清单:
<receiver android:name=".CallReceiver">
<intent-filter android:priority="999">
<action android:name="android.intent.action.PHONE_STATE" />
</intent-filter>
</receiver>
onReceive方法本身非常简单:
public void onReceive(Context voCtx, Intent voIntent)
{
Log(voCtx, "onReceive: " + voIntent.getAction());
if(voIntent.getAction().equals(TelephonyManager.ACTION_PHONE_STATE_CHANGED))
{
HandleCallStateChanged(voCtx, voIntent);
}
}
只记录输出到我的日志文件,所以我可以看到发生了什么。我不确定为什么onReceive()
有时会被调用。其他应用程序是否可以拦截广播并在我的应用获取之前取消它们?
答案 0 :(得分:0)
Android现在具有Doze和App待机功能。因此,如果您的应用进入此模式,则您的BroadcastReceiver
将不会触发。
要让您的接收器被触发,您可以使用REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
权限。这样您的应用就会被排除在电池优化过程之外。
注意:如果您不小心使用此权限,GOOGLE可能会覆盖您的应用
答案 1 :(得分:0)
看起来这是三星手机特有的。在电池设置下,有一个&#34;应用电源监控器&#34; (除了正常的电池优化之外)。这个应用程序电源监视器可以将应用程序放入&#34; sleep&#34; (与App Standby不同)。将我的应用程序设置为&#34;未受监控的应用程序&#34;似乎解决了我的问题。