从 BroadCast 发送意图时为 Null Extra
Null Extra when sending intent from BroadCast
我有一个广播接收器,它检测应用程序是否连接到 Internet 并发送带有额外字符串的意图。但是我得到了一个空的 Extra :
这是广播接收器
public class NetworkChangeReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
final ConnectivityManager connMgr = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
final android.net.NetworkInfo wifi = connMgr
.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
final android.net.NetworkInfo mobile = connMgr
.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
if (wifi.isAvailable() || mobile.isAvailable()) {
context.sendBroadcast(new Intent().putExtra("cnx","yes"));
}
else{
context.sendBroadcast(new Intent().putExtra("cnx","no"));
}
}
}
这是我的 Activity 代码:
networkChangeReceiver=new NetworkChangeReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String val=intent.getStringExtra("cnx");
Snackbar snackbar = Snackbar
.make(layoutLauncher, "Pas de connexion Internet!"+val, Snackbar.LENGTH_LONG);
snackbar.show();
/* if (val.equals("internet")){
isNetworkAvailable(false);
}
else{
isNetworkAvailable(true);
}*/
}
};
这是注册码
private void registerNetworkBroadcast() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
registerReceiver(networkChangeReceiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
registerReceiver(networkChangeReceiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
}
}
这是清单的一部分
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="tn.formation.mdsoft.bulletinimmobilier">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<application.....
<activity android:name=".ui.activities.LauncherActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service
android:name=".services.MyFirebaseMessagingService">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT"/>
</intent-filter>
</service>
<service
android:name=".services.MyFirebaseInstanceIDService">
<intent-filter>
<action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
</intent-filter>
</service>
<receiver android:name=".tools.NetworkChangeReceiver" >
</receiver>
Intent 适用于 LauncherActivity。
编辑
这个场景无论如何都是错误的,所以我忽略了它的实现,但在这种情况下,最好验证密钥。
But I am getting a null Extra
Android 在 Intent
上没有 "internet"
或 "cnx"
。而且,你正在创建一个无限循环。
系统发出CONNECTIVITY_ACTION
广播
您有两个注册了该广播的接收器,并且都接收了该广播,没有 "internet"
或 "cnx"
额外的。
一个接收者将 "cnx"
额外添加到 CONNECTIVITY_ACTION
Intent
并发送广播。
您有两个注册了该广播的接收器,并且都接收了广播,并且 "cnx"
额外。
一个接收者将 "cnx"
extra 重新添加到 CONNECTIVITY_ACTION
Intent
并发送广播。
您有两个注册了该广播的接收器,并且都接收了广播,并且 "cnx"
额外。
一个接收者将 "cnx"
extra 重新添加到 CONNECTIVITY_ACTION
Intent
并发送广播。
起泡、冲洗、重复
首先,不要使用系统广播在应用程序的单个进程内进行通信。使用 LocalBroadcastManager
.
其次,不要发送带有系统Intent
操作的广播。充其量,你搞砸了设备上的许多其他应用程序。在最坏的情况下,您会崩溃,因为系统会阻止您发送该广播。
而且,,您没有为您的额外使用相同的密钥。
您的意图键不同
在这里你的关键是 "cnx"
if (wifi.isAvailable() || mobile.isAvailable()) {
context.sendBroadcast(intent.putExtra("cnx","yes"));
}
else{
context.sendBroadcast(intent.putExtra("cnx","no"));
}
您正在使用此处的 "internet" 键检索
String val=intent.getStringExtra("internet");
改为:
String val=intent.getStringExtra("cnx");
我有一个广播接收器,它检测应用程序是否连接到 Internet 并发送带有额外字符串的意图。但是我得到了一个空的 Extra :
这是广播接收器
public class NetworkChangeReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
final ConnectivityManager connMgr = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
final android.net.NetworkInfo wifi = connMgr
.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
final android.net.NetworkInfo mobile = connMgr
.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
if (wifi.isAvailable() || mobile.isAvailable()) {
context.sendBroadcast(new Intent().putExtra("cnx","yes"));
}
else{
context.sendBroadcast(new Intent().putExtra("cnx","no"));
}
}
}
这是我的 Activity 代码:
networkChangeReceiver=new NetworkChangeReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String val=intent.getStringExtra("cnx");
Snackbar snackbar = Snackbar
.make(layoutLauncher, "Pas de connexion Internet!"+val, Snackbar.LENGTH_LONG);
snackbar.show();
/* if (val.equals("internet")){
isNetworkAvailable(false);
}
else{
isNetworkAvailable(true);
}*/
}
};
这是注册码
private void registerNetworkBroadcast() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
registerReceiver(networkChangeReceiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
registerReceiver(networkChangeReceiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
}
}
这是清单的一部分
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="tn.formation.mdsoft.bulletinimmobilier">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<application.....
<activity android:name=".ui.activities.LauncherActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service
android:name=".services.MyFirebaseMessagingService">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT"/>
</intent-filter>
</service>
<service
android:name=".services.MyFirebaseInstanceIDService">
<intent-filter>
<action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
</intent-filter>
</service>
<receiver android:name=".tools.NetworkChangeReceiver" >
</receiver>
Intent 适用于 LauncherActivity。
编辑
这个场景无论如何都是错误的,所以我忽略了它的实现,但在这种情况下,最好验证密钥。
But I am getting a null Extra
Android 在 Intent
上没有 "internet"
或 "cnx"
。而且,你正在创建一个无限循环。
系统发出
CONNECTIVITY_ACTION
广播您有两个注册了该广播的接收器,并且都接收了该广播,没有
"internet"
或"cnx"
额外的。一个接收者将
"cnx"
额外添加到CONNECTIVITY_ACTION
Intent
并发送广播。您有两个注册了该广播的接收器,并且都接收了广播,并且
"cnx"
额外。一个接收者将
"cnx"
extra 重新添加到CONNECTIVITY_ACTION
Intent
并发送广播。您有两个注册了该广播的接收器,并且都接收了广播,并且
"cnx"
额外。一个接收者将
"cnx"
extra 重新添加到CONNECTIVITY_ACTION
Intent
并发送广播。起泡、冲洗、重复
首先,不要使用系统广播在应用程序的单个进程内进行通信。使用 LocalBroadcastManager
.
其次,不要发送带有系统Intent
操作的广播。充其量,你搞砸了设备上的许多其他应用程序。在最坏的情况下,您会崩溃,因为系统会阻止您发送该广播。
而且,
您的意图键不同 在这里你的关键是 "cnx"
if (wifi.isAvailable() || mobile.isAvailable()) {
context.sendBroadcast(intent.putExtra("cnx","yes"));
}
else{
context.sendBroadcast(intent.putExtra("cnx","no"));
}
您正在使用此处的 "internet" 键检索
String val=intent.getStringExtra("internet");
改为:
String val=intent.getStringExtra("cnx");