我的目标是即使手机处于睡眠模式。但是,我在Lollipop上遇到了一些奇怪的行为。
问题:
当电话按模式站立时(不使用> 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()
之外。当然,这一切都应该在服务内部工作。这可能会有所帮助:在铃声期间更改铃声