为什么我的BroadCast接收器不工作?

时间:2017-05-16 16:57:58

标签: android broadcastreceiver

我正在学习BroadCast接收器。我想用下面的代码实现的是,当我切换到飞行模式时,我想看到一个吐司,应用程序是否打开。我不做什么/做错了什么?请帮忙。感谢

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

<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<uses-permission android:name="android.permission.SEND_SMS"/>
<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    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=".ConnectivityChangedReceiver">
        <intent-filter>
            <action android:name="android.intent.action.AIRPLANE_MODE">
            </action>
        </intent-filter>

    </receiver>

</application>

MainActivity.java`

 import android.support.v7.app.AppCompatActivity;
 import android.os.Bundle;
 import android.content.Intent;


 import java.util.ArrayList;

 public class MainActivity extends AppCompatActivity {

private TextView switchStatus;
private Switch mySwitch;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
 }
 }

6 个答案:

答案 0 :(得分:3)

来自android文档:

https://developer.android.com/guide/components/broadcast-exceptions

  

作为Android 8.0(API级别26)后台执行限制的一部分,   面向API级别26或更高级别的应用程序无法再注册   清单中隐式广播的广播接收器。   但是,目前有一些广播免于这些广播   局限性。应用可以继续注册以下内容的监听器   广播,无论应用程序所针对的API级别是什么。

https://developer.android.com/distribute/best-practices/develop/target-sdk

  

Google Play将要求新应用至少针对Android 8.0   (API级别26)从2018年8月1日开始,并且该应用更新目标   从2018年11月1日开始使用Android 8.0。

“ android.intent.action.AIRPLANE_MODE” 不再在豁免广播列表中。因此,请在活动中而不是在AndroidManifest中注册您的广播接收器。

答案 1 :(得分:1)

尝试这样,尝试添加,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
        }
    }

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

广播接收人的官方文件说:

android:exported

广播接收器是否可以从其应用程序之外的来源接收消息 - 如果可以,则为“true”,否则为“false”。如果为“false”,则广播接收者可以接收的唯一消息是由具有相同用户ID的相同应用程序或应用程序的组件发送的消息。

答案 4 :(得分:0)

所以我刚刚找到了解决上述问题的方法。 我改变了

<receiver android:name=".ConnectivityChangedReceiver">

<receiver android:name="ConnectivityChangedReceiver">

(没有&#39;。&#39;在名字的开头。希望它有助于一个搁浅的人!

答案 5 :(得分:0)

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

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相同的软件包中,这样才能使上述工作正常。名称字段中的第一个点表示Class是bundles名称空间的成员。因此,由于它不是包装中的,所以点使它看起来在错误的位置。