2016-11-27 3 views
0

Ich versuche, eine BroadcastReceiver zum Überprüfen der Internetverbindung zu schreiben. Aber es funktioniert nicht. Mein Receiver ist:Broadcast-Empfänger zum Aktivieren der mobilen Verbindung funktioniert nicht

public class MobileDataOnBroadcastReceiver extends BroadcastReceiver{ 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     Log.d(MainActivity.TAG, "Broadcast received"); 
     Intent intent1 = new Intent(context, LoadPictureService.class); 
     context.startService(intent1); 
    } 
} 

Wenn ich versuche, es in MainActivity dynamisch zu registrieren, erhalte ich „Cannot resolve symbol conn“:

Wenn ich versuche, es zu registrieren in einem Manifest, BroadcastReceiver startet einfach nicht an allen . Mein Manifest:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.aleksandr.homework3"> 

    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
    <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=".MobileDataOnBroadcastReceiver"> 
      <intent-filter> 
       <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> 
      </intent-filter> 
     </receiver> 
    </application> 
</manifest> 

Es gibt durchaus ein paar Fragen auf Stack Overflow zu diesem Thema, aber niemand beantwortet meine Frage. Warum kann ich BroadcastReceiver nicht dynamisch registrieren? Warum funktioniert es nicht in Manifest? Was soll ich tun, damit es funktioniert?

Antwort

2

Sie müssen den Empfänger unter Verwendung der API this dynamisch registrieren. Beachten Sie, dass das zweite Argument IntentFilter ist. Sie können versuchen, den folgenden Code

IntentFilter filter = new IntentFilter(); 
filter.addAction(android.net.ConnectivityManager.CONNECTIVITY_ACTION); 
// this is the constant value android.net.conn.CONNECTIVITY_CHANGE 
registerReceiver(receiver, filter); 

dass Beachten Sie auch, wenn Sie zielen API 24 oder höher, dann werden Sie nicht diese Sendung bekommen, die durch den offensichtlichen Eintrag registriert ist.

Siehe this.

Auf Android 7.0 ausgerichtete Apps empfangen keine CONNECTIVITY_ACTION-Broadcasts, selbst wenn sie über Manifesteinträge verfügen, um eine Benachrichtigung über diese Ereignisse anzufordern. Apps, die ausgeführt werden, können weiterhin auf CONNECTIVITY_CHANGE in ihrem Hauptthread warten, wenn sie eine Benachrichtigung mit einem BroadcastReceiver anfordern.

Im Allgemeinen dynamisch registrierten Empfänger ist der Weg für solche Sendungen zu gehen. Denken Sie daran, sie nicht ordnungsgemäß zu entfernen, wenn sich der Status Ihres Komponentenlebenszyklus ändert oder Sie die Übertragung nicht mehr benötigen.

+1

Weitere Informationen finden Sie in diesem Video: https://www.youtube.com/watch?v=vBjTXKpaFj8 –

Verwandte Themen