Android O后台限制 - 确实会影响android.intent.action.PHONE_STATE吗?

时间:2017-07-13 11:13:20

标签: android android-broadcast android-background android-8.0-oreo

我已经实现了一个隐式广播接收器来收听电话

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


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

我编译并制作目标26 但我的广播接收器仍然像往常一样工作。

我在这里阅读https://developer.android.com/preview/features/background.html#broadcasts,这不再适用了。

如果我的广播android.permission.READ_PHONE_STATE

有异常,有人可以告诉我

2 个答案:

答案 0 :(得分:1)

您确定已将编译SDK和构建工具设置为版本26吗?

compileSdkVersion 26
buildToolsVersion "26.0.0"

动作android.intent.action.PHONE_STATE的意图没有隐式广播异常,因为此意图不是直接针对您的应用程序而且不是listed as exception,所以即使这样也适用于预览版本在Android O中,它可能不再适用于Android O的生产版本。

除了意图的意图的一个例子是动作android.intent.action.MY_PACKAGE_REPLACED的意图,因为这个意图针对一个特定的应用程序,正在更新应用程序。

一般的想法是通过不必要地使用通用广播唤醒所有应用程序来节省电力(电池使用)。

您可以通过在服务中注册广播接收器来解决此问题,您可能希望将其作为前台服务,因为还有limitations on background services in Android O。强制执行前台服务以显示通知(可以是最小优先级,以便关联图标不会出现在状态栏中,至少在Google的Android版本中)。这里的想法是用户应该知道任何可能使用电池电量的东西。

答案 1 :(得分:0)

实际上,“定位”不是指编译版本,而是“目标”版本。因此,请检查build.gradle中是否有下一行:

defaultConfig {
    applicationId 'com.yourid'
    targetSdkVersion 26
}

例如,您的应用可以在较新的应用上进行编译,但可以针对上一个进行编译:

android {
    compileSdkVersion 26
    buildToolsVersion "26.0.2"

    defaultConfig {
        applicationId 'com.yourid'
        minSdkVersion 21
        targetSdkVersion 25
}