我有一个广播接收器,可以检测应用程序是否连接到Internet,并发送带有字符串额外的意图。但我得到一个null Extra:
这是BroadcastReceiver
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"));
}
}
}
这是我的活动代码:
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>
意图适用于LauncherActivity。
修改
无论如何情况都是错误的,所以我忽略了它的实现,但在这种情况下,更好地验证密钥。
答案 0 :(得分:2)
但我得到一个null Extra
Android "internet"
上没有"cnx"
或Intent
额外费用。而且,你正在创造一个无限循环。
系统发出CONNECTIVITY_ACTION
广播。
您有两个为该广播注册的接收者,并且都接收广播,没有"internet"
或"cnx"
额外。
一位接收者将"cnx"
额外内容添加到CONNECTIVITY_ACTION
Intent
并发送广播。
您有两个为该广播注册的接收器,并且都接收广播,并且"cnx"
额外。
一位接收者将"cnx"
额外费用重新添加到CONNECTIVITY_ACTION
Intent
并发送广播。
您有两个为该广播注册的接收器,并且都接收广播,并且"cnx"
额外。
一位接收者将"cnx"
额外费用重新添加到CONNECTIVITY_ACTION
Intent
并发送广播。
泡沫,冲洗,重复
首先,不使用系统广播在应用的单个进程中进行通信。使用LocalBroadcastManager
。
其次,不发送带有系统Intent
操作的广播。充其量,你搞砸了设备上的许多其他应用程序。最糟糕的是,你崩溃了,因为系统阻止你发送那个广播。
而且,as Burhanuddin pointed out,您没有使用相同的密钥。
答案 1 :(得分:1)
您的意图密钥不同 你关键的是&#34; cnx&#34;
if (wifi.isAvailable() || mobile.isAvailable()) {
context.sendBroadcast(intent.putExtra("cnx","yes"));
}
else{
context.sendBroadcast(intent.putExtra("cnx","no"));
}
您正在使用&#34; internet&#34;关键在这里
String val=intent.getStringExtra("internet");
将其更改为:
String val=intent.getStringExtra("cnx");