我正在学习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);
}
}
答案 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名称空间的成员。因此,由于它不是包装中的,所以点使它看起来在错误的位置。