java - 当 App 在 Oreo 中被杀死时广播接收器不工作为什么?

标签 java android android-broadcastreceiver android-8.0-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();


        }

    }

}

这是我的 list

<?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>

最佳答案

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

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()。

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

关于java - 当 App 在 Oreo 中被杀死时广播接收器不工作为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51132542/

相关文章:

android - 无法使用 Media.ALBUM_ART

java - 迁移到 Java 8 后,Jaxb 无法解析 XML

java - Bean 访问器的 Genson 缓存

java - onDraw() 方法中的 NullPointerException Android 绘图应用程序?

java - 为什么 Java 无法加载此类 : com. android.org.conscrypt.OpenSSLRSAPublicKey

android - JsonArray解析

java - wifi广播接收器多个 Intent

android - Oreo BroadcastReceiver SMS Received 不工作

android - BroadcastReceiver 收不到广播事件消息

Java Applet init 非常慢 - java 1.8。 u60