【问题标题】:Broadcast Receiver not working when the App killed in Oreo Why?当应用程序在奥利奥中被杀死时,广播接收器不工作为什么?
【发布时间】:2018-07-02 09:07:06
【问题描述】:

如何在 Oreo 中使用广播接收器接收传入消息的数据,它在 Oreo 版本之前的工作完美,但我无法在 Oreo 中接收,我试图通过开发者网站的帮助来缩短它,但没有此处提供了仅适用于 Oreo 限制的任何示例代码

这是我的广播接收器类

public class SMSReceiver extends BroadcastReceiver


{
String sender,message;
public void onReceive(Context context, Intent intent) {

    Bundle myBundle = intent.getExtras();
    SmsMessage[] messages = null;
    String strMessage = "";

    if (myBundle != null) {
        Object[] pdus = (Object[]) myBundle.get("pdus");
        messages = new SmsMessage[pdus.length];

        SmsMessage shortMessage=SmsMessage.createFromPdu((byte[]) pdus[0]);
        for (int i = 0; i < messages.length; i++) {
            messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
            sender=messages[i].getOriginatingAddress();

            String message =shortMessage.getMessageBody();



        Toast.makeText(context, sender+"\n"+message, Toast.LENGTH_SHORT).show();


        }

    }

}

这是我的清单

<?xml version="1.0" encoding="utf-8"?>

<uses-permission android:name="android.permission.READ_SMS"/>
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.WAKE_LOCK" />

<application
    android:allowBackup="true"
    android:icon="@drawable/logo"
    android:label="@string/app_name"
    android:roundIcon="@drawable/logo"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>


    <receiver android:name=".SMSReceiver" android:enabled="true" android:exported="true">
        <intent-filter
            android:priority="1000"
            >
            <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
            <action android:name="android.intent.action.BOOT_COMPLETED"/>
        </intent-filter>
    </receiver>


    </service>

</application>

【问题讨论】:

  • 为什么你用同一个接收器接收短信和开机完成?接收器应该仍然可以在奥利奥中工作,这是正确的方法:medium.com/@berriz_/…
  • 这可能是因为您可能在您的活动的 onDestroy() 方法中取消注册广播接收器,并且在打开应用程序后没有重新注册它。
  • 我没有在我的应用程序的任何地方注册或取消注册广播接收器,它在奥利奥之前的 android 版本中工作,但在奥利奥 @Android 中不工作对我来说就是一切
  • 我尝试了您的首选链接,但它仍然无法正常工作@Hed Shafran,感谢您的评论
  • @Basant 你有解决办法吗?

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


【解决方案1】:

从 Android Oreo 开始,大多数广播接收器需要在运行时注册,而不是清单声明。

BroadcastReceiver myReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        //Do Something
    }
};

然后注册接收者:

IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(ConnectivityManager.THE_REQUIRED_ACTION);
registerReceiver(myReceiver, intentFilter);

并注销:

unregisterReceiver(myReceiver);

您可以在运行时注册/注销接收器,方法是将上面的代码分别添加到 onResume()/onPause() 中。

如果您希望接收器在应用程序在后台运行时仍然存在,您可以在您的应用程序类中注册/取消注册。 如果您希望它在用户退出应用程序后仍然存在,您需要在服务或作业调度程序中注册接收器。

【讨论】:

  • @RitobrotoGanguly 请帮助我理解您所说的“完全错误”是什么意思,以及您的链接如何与我上面写的内容相矛盾。对我来说早上可能太早了,但我没有看到问题。
  • @RitobrotoGanguly 请在此处查看并重新评估您的评论:“作为 Android 8.0(API 级别 26)后台执行限制的一部分,针对 API 级别 26 或更高级别的应用程序无法再注册广播清单中隐式广播的接收器。” developer.android.com/guide/components/broadcast-exceptions 此外,如果您有一个正在运行的服务,其中注册了广播,那么您的服务/应用程序将收到任何触发。
【解决方案2】:

我认为这可能是因为您还需要将其添加为permission,如下所示:

<receiver
    android:name=".SMSReceiver"
    android:enabled="true"
    android:exported="true"
    android:permission="android.permission.RECEIVE_BOOT_COMPLETED">
    <intent-filter android:priority="1000">
        <action android:name="android.intent.action.BOOT_COMPLETED"/>
        <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
    </intent-filter>
</receiver>

【讨论】:

  • 它仍然无法正常工作,但感谢@Anthony Cannon 的回复
  • 你试过简化吗?所以删除:enabledexportedRECEIVE_BOOT_COMPLETEDpriorityBOOT_COMPLETED
  • 是的,我试过但得到相同的结果@Anthony Cannon
猜你喜欢
  • 1970-01-01
  • 2018-05-20
  • 2019-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多