Ich entwickle einen Android-Rundfunkempfänger zur Überprüfung der Internetverbindung.
Das Problem ist, dass mein Broadcast-Empfänger zwei Mal aufgerufen wird. Ich möchte, dass er nur aufgerufen wird, wenn das Netzwerk verfügbar ist. Wenn es nicht verfügbar ist, möchte ich nicht benachrichtigt werden.
Dies ist der Broadcast-Empfänger
public class NetworkChangeReceiver extends BroadcastReceiver {
@Override
public void onReceive(final Context context, final 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()) {
// Do something
Log.d("Network Available ", "Flag No 1");
}
}
}
Dies ist die manifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.broadcastreceiverforinternetconnection"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<receiver android:name=".NetworkChangeReceiver" >
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
<action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
</intent-filter>
</receiver>
</application>
</manifest>
Antwort auf Ihre erste Frage: Ihr Rundfunkempfänger wird zwei Mal angerufen, weil
Sie haben zwei <intent-filter>
hinzugefügt
Änderung der Netzwerkverbindung :
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
Änderung des WiFi-Status:
<action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
Einfach eine verwenden:
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
.
Es wird nur auf eine Aktion reagieren, anstatt auf zwei. Siehe hier für weitere Informationen.
Antwort auf Ihre zweite Frage (Sie möchten, dass der Empfänger nur einmal anruft, wenn eine Internetverbindung verfügbar ist):
Ihr Code ist perfekt; Sie benachrichtigen nur, wenn das Internet verfügbar ist.
UPDATE
Sie können diese Methode verwenden, um zu prüfen, ob Ihr Handy mit dem Internet verbunden ist oder nicht.
public boolean isOnline(Context context) {
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = cm.getActiveNetworkInfo();
//should check null because in airplane mode it will be null
return (netInfo != null && netInfo.isConnected());
}
public static boolean isNetworkAvailable(Context context) {
boolean isMobile = false, isWifi = false;
NetworkInfo[] infoAvailableNetworks = getConnectivityManagerInstance(
context).getAllNetworkInfo();
if (infoAvailableNetworks != null) {
for (NetworkInfo network : infoAvailableNetworks) {
if (network.getType() == ConnectivityManager.TYPE_WIFI) {
if (network.isConnected() && network.isAvailable())
isWifi = true;
}
if (network.getType() == ConnectivityManager.TYPE_MOBILE) {
if (network.isConnected() && network.isAvailable())
isMobile = true;
}
}
}
return isMobile || isWifi;
}
/* You can write such method somewhere in utility class and call it NetworkChangeReceiver like below */
public class NetworkChangedReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent) {
if (isNetworkAvailable(context))
{
Toast.makeText(context, "Network Available Do operations",Toast.LENGTH_LONG).show();
}
}
}
Der obige Broadcast-Empfänger wird nur aufgerufen, wenn der Netzwerkstatus auf "connected" wechselt und nicht auf "disconnected".
Versuchen Sie es mit diesem
public class ConnectionBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (<Check internet connection available >) {
Toast.makeText(context, "connect to the internet", Toast.LENGTH_LONG).show();
/*upload background upload service*/
Intent serviceIntent = new Intent(context,<your service class>);
context.startService(serviceIntent);
}else{
Toast.makeText(context, "Connection failed", Toast.LENGTH_LONG).show();
}
}
}
Sobald die Internetverbindung ausgelöst wird, wird dies (BroadcastReciever) geladen