在 Oreo 中注册静态广播接收器

Registering Static Broadcast receiver in Oreo

我正在做一个记录来电和去电的项目, 但是对于 Oreo 静态广播接收器(在清单中注册的广播接收器)没有被触发。 如果我注册上下文,一旦应用程序被杀死,广播将不会被触发。

我希望即使应用程序关闭,广播接收器也能正常工作。

有什么方法可以实现这个奥利奥吗?或任何其他替代方法来实现这一目标? 任何帮助将不胜感激。

我正在按照以下代码在清单中注册

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

Oreo 中存在一些广播限制,它不再支持在应用程序清单中为隐式广播注册广播接收器。而NEW_OUTGOING_CALL就是其中之一,阅读here

您可以根据自己的目的使用 PHONE_STATE 操作,因为它尚未归类为隐式广播

public class StateReceiver extends BroadcastReceiver {

  @Override
  public void onReceive(Context context, Intent intent) {
   // will trigger at incoming/outgoing call

    try {
        String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);
        String incomingNumber = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);
        String outgoingNumber = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
    }
    catch (Exception e){
        e.printStackTrace();
    }
  }
}

清单中,

        <receiver android:name=".StateReceiver">
        <intent-filter>
            <action android:name="android.intent.action.PHONE_STATE" />
        </intent-filter>
        </receiver>

您还需要添加并检查 READ_PHONE_STATE 权限

您可以在此处找到一些隐式广播异常 https://developer.android.com/guide/components/broadcast-exceptions,ACTION_NEW_OUTGOING_CALL 就是其中之一。

我在这里的类似回答: