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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了当手机处于睡眠模式时,为什么用于来电的广播接收器在棒棒糖上不起作用相关的知识,希望对你有一定的参考价值。

我的目标是始终检测来电,即使手机处于睡眠模式。但是,我在棒棒糖上遇到了一些奇怪的行为。

问题:

当手机处于待机模式(未使用> 10分钟)时,广播接收器的onReceive()方法不会被调用。

这适用于Kitkat,Marshmallow和Nougat。也许有人有同样的问题?

<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />

<receiver android:name=".PhoneCallReceiver"
              android:enabled="true">
        <intent-filter>
            <action android:name="android.intent.action.PHONE_STATE" />
            <action android:name="android.intent.action.NEW_OUTGOING_CALL" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </receiver>

接收器:

public class PhoneCallReceiver extends BroadcastReceiver {

   @Override
   public void onReceive(Context context, Intent intent) {
    prefs = PreferenceManager.getDefaultSharedPreferences(context);
    if (intent.getAction().equals("android.intent.action.NEW_OUTGOING_CALL")) {
        String nr = Utils.fixNumber(intent.getExtras().getString("android.intent.extra.PHONE_NUMBER"));
        prefs.edit().putString("LastActiveNr", nr).apply();
    } else {
        String stateStr = intent.getExtras().getString(TelephonyManager.EXTRA_STATE);

        int state = 0;

        if (TelephonyManager.EXTRA_STATE_IDLE.equals(stateStr)) {

            state = TelephonyManager.CALL_STATE_IDLE;
            prefs.edit().putInt("state", state).apply();

        } else if (TelephonyManager.EXTRA_STATE_OFFHOOK.equals(stateStr)) {

            state = TelephonyManager.CALL_STATE_OFFHOOK;
            prefs.edit().putInt("state", state).apply();

        } else if (stateStr.equals(TelephonyManager.EXTRA_STATE_RINGING)) {
            state = TelephonyManager.CALL_STATE_RINGING;
            prefs.edit().putInt("state", state).apply();
            String nr = Utils.fixNumber(intent.getExtras().getString(TelephonyManager.EXTRA_INCOMING_NUMBER));
            prefs.edit().putString("LastActiveNr", nr).apply();
        }
        onCallStateChanged(context);
    }
}
答案

我认为你在你的onReceive()方法中做了很多。我会尝试将prefs = PreferenceManager.getDefaultSharedPreferences(context);移到onReceive()之外。当然这一切都应该在Service内部工作。这可能会有所帮助:Changing ringer volume during ringing

以上是关于当手机处于睡眠模式时,为什么用于来电的广播接收器在棒棒糖上不起作用的主要内容,如果未能解决你的问题,请参考以下文章

手机进入睡眠状态后,在前台服务中保持 wifi 处于活动状态

从睡眠模式唤醒时不会播放音频(android)

当 iphone 处于睡眠模式/锁定时,如何使用视频播放?

应用程序处于睡眠模式时如何检测语音?

设备处于睡眠模式时不会出现 Android GCM 通知

Android来电监听