Android 为什么我的广播接收器不工作?

Android 为什么我的广播接收器不工作?,android,broadcastreceiver,Android,Broadcastreceiver,我正在学习广播接收机。我试图通过下面的代码实现的是,当我切换到飞行模式时,无论应用程序是否打开,我都希望看到一个祝酒词。我没有做错什么?请帮忙。谢谢 ConnectivityChangedReceiver.java类 import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.net.ConnectivityManag

我正在学习广播接收机。我试图通过下面的代码实现的是,当我切换到飞行模式时,无论应用程序是否打开,我都希望看到一个祝酒词。我没有做错什么?请帮忙。谢谢

ConnectivityChangedReceiver.java类

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.widget.Toast;

public class ConnectivityChangedReceiver extends BroadcastReceiver {

@Override
public void onReceive( Context context, Intent intent )
{
    Toast.makeText(context, "Intent Detected.", Toast.LENGTH_LONG).show();

}
}
AndroidManifest.xml

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

您必须在manifest.xml文件中启用广播:

<receiver android:enabled="true" android:name=". ConnectivityChangedReceiver">
    <intent-filter>
        <action android:name="android.intent.action.AIRPLANE_MODE"/>
    </intent-filter>
</receiver>

像这样尝试,尝试添加,android:exported=“true”:

//也添加此权限

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


 <receiver android:enabled="true" android:name=".ConnectivityChangedReceiver"
android:exported="true">
        <intent-filter>
            <action android:name="android.intent.action.ACTION_AIRPLANE_MODE_CHANGED"/>
        </intent-filter>
    </receiver>

The Real state is determined like this:

    @Override
    public void onReceive(Context context, Intent intent) {

        boolean isAirplaneModeOn = intent.getBooleanExtra("state", false);
        if(isAirplaneModeOn){

           // handle Airplane Mode on
        } else {
           // handle Airplane Mode off
        }
    }

实际状态是这样确定的:
@凌驾
公共void onReceive(上下文、意图){
布尔值isAirplaneModeOn=intent.getBooleanExtra(“状态”,false);
如果(isAirplaneModeOn){
//打开飞机模式
}否则{
//关闭飞机模式
}
}

广播电台的官方文件说:

android:exported

广播接收器是否可以从其应用程序之外的源接收消息—如果可以,则为“真”,如果不能,则为“假”。如果为“false”,则广播接收器只能接收由相同应用程序的组件或具有相同用户ID的应用程序发送的消息。

因此,我刚刚找到了上述问题的解决方案。 我变了

<receiver android:name=".ConnectivityChangedReceiver">



(名称开头没有“.”。希望它对搁浅者有帮助!

您需要将接收器放入捆绑包中:

package my.bundles.id;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.widget.Toast;

public class ConnectivityChangedReceiver extends BroadcastReceiver {

@Override
public void onReceive( Context context, Intent intent )
{
    Toast.makeText(context, "Intent Detected.", Toast.LENGTH_LONG).show();

}
}

你应该把它放在一个与bundleId相同的包中,这样就可以实现上述功能。name字段中的第一个点表示该类是bundles命名空间的成员。因此,由于它不在包中,所以该点使它看起来不正确。

来自android文档:

作为Android 8.0(API级别26)后台执行限制的一部分, 针对API级别26或更高的应用程序不能再注册 广播接收器,用于其清单中的隐式广播。 然而,一些广播目前不受这些限制 限制。应用程序可以继续为以下内容注册侦听器 广播,无论应用程序的目标API级别如何

Google Play将要求新的应用程序至少针对安卓8.0 (API等级26)从2018年8月1日起生效,该应用程序将更新目标 Android 8.0自2018年11月1日起生效


“android.intent.action.Planet\u MODE”不再在豁免广播列表中。因此,请在activity中而不是AndroidManifest中注册您的广播接收器。

您想对该广播执行什么操作?在什么之后启动?切换到飞行模式后,我想看祝酒词“Intent检测到‘您使用的是什么设备?’我正在使用一个物理设备进行调试(索尼)Din不工作。尝试了另一个广播,但仍然无法工作。尝试了另一个广播,但仍然无法工作:-(嗨@Roy。我已经添加了这个,但仍然没有得到任何回应。我应该在主活动中添加什么吗?还有什么可能是错误的?:-(试试这个新动作@Mos@Mos写下这个许可,让我知道你是否可以触发intentHi@Roy。我发现了问题,在清单的下面一行。我只是简单地改为感谢@Abhishek,感谢你的回答。以前我只是试图从清单使用,花费了我太多的时间。这应该写在清单上ide ANdroidManifest.xml?
<receiver android:name=".ConnectivityChangedReceiver">
<receiver android:name="ConnectivityChangedReceiver">
package my.bundles.id;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.widget.Toast;

public class ConnectivityChangedReceiver extends BroadcastReceiver {

@Override
public void onReceive( Context context, Intent intent )
{
    Toast.makeText(context, "Intent Detected.", Toast.LENGTH_LONG).show();

}
}