广播接收器,用于零播和Oreo +设备不起作用

时间:2018-09-17 09:16:01

标签: java android broadcastreceiver android-8.0-oreo android-7.0-nougat

public class ScreenReceiver extends BroadcastReceiver {

    private boolean screenOff;

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF))    {
            screenOff = true;
        } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
            screenOff = false;
        }

    }


   <receiver
             android:name=".ScreenReceiver"
             android:enabled="true"
             android:exported="true">
             <intent-filter>
                <action android:name="android.intent.action.PHONE_STATE" />
                 <action android:name="android.intent.action.DREAMING_STARTED" />
                <action android:name="android.intent.action.DREAMING_STOPPED" />
                 <action android:name="android.intent.action.CLOSE_SYSTEM_DIALOGS" />
                 <action android:name="android.intent.action.SCREEN_ON" />
                 <action android:name="android.intent.action.SCREEN_OFF" />
                <action android:name="android.intent.action.LOCKED_BOOT_COMPLETED" />
                 <action android:name="android." />
             </intent-filter>
        </receiver>
  

在零启动和奥利奥设备上没有得到任何回调,在棉花糖设备上尝试了正常工作。但是在奥利奥设备上,它无法正常工作,也因为电池已连接并且网络更改接收器不工作。

1 个答案:

答案 0 :(得分:2)

您无法在Oreo的manifest.xml中注册广播接收器。 您可以看到 Android 8.0 Behavior Changes

  

应用程序无法使用其清单来注册大多数隐式   广播(即不专门针对   该应用程序。)

解决方案

改为在相关活动中注册您的接收者。这样。

public class MainActivity extends AppCompatActivity {
    BroadcastReceiver receiver;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        IntentFilter filter = new IntentFilter();
        filter.addAction(Intent.ACTION_SCREEN_OFF);
        filter.addAction(Intent.ACTION_SCREEN_ON);
        filter.addAction("android.intent.action.LOCKED_BOOT_COMPLETED");
        receiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                // todo
            }
        };
        registerReceiver(receiver, filter);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (receiver != null)
            unregisterReceiver(receiver);
    }
}

如果找不到相关的常量字符串,则可以将动作添加为与清单相同的字符串。