并不总是调用onReceive()

时间:2018-03-19 15:38:57

标签: android broadcastreceiver

出于某种原因,并不总是调用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()有时会被调用。其他应用程序是否可以拦截广播并在我的应用获取之前取消它们?

2 个答案:

答案 0 :(得分:0)

Android现在具有Doze和App待机功能。因此,如果您的应用进入此模式,则您的BroadcastReceiver将不会触发。

要让您的接收器被触发,您可以使用REQUEST_IGNORE_BATTERY_OPTIMIZATIONS权限。这样您的应用就会被排除在电池优化过程之外。

注意:如果您不小心使用此权限,GOOGLE可能会覆盖您的应用

答案 1 :(得分:0)

看起来这是三星手机特有的。在电池设置下,有一个&#34;应用电源监控器&#34; (除了正常的电池优化之外)。这个应用程序电源监视器可以将应用程序放入&#34; sleep&#34; (与App Standby不同)。将我的应用程序设置为&#34;未受监控的应用程序&#34;似乎解决了我的问题。