2017-10-01 6 views
2

Mein Manifest.xmlBroadcastReceiver funktioniert nicht?

<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 
<application 
     android:name="android.support.multidex.MultiDexApplication" 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:roundIcon="@mipmap/ic_launcher_round" 
     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=".MyBroadCastRecieverInternet"> 
      <intent-filter> 
       <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> 
      </intent-filter> 
     </receiver> 
    </application> 

Sein mein Service-Code-Block.

public class MyBroadCastRecieverInternet extends BroadcastReceiver { 

    public void onReceive(final Context context, Intent intent) { 
     Log.d("MyLog","Internet Reciever is on"); 
    } 

} 

Gibt es einen Fehler? Ich habe nichts gefunden. Es funktioniert nicht und ich weiß nicht warum.

+0

was möchten Sie tun? – user1506104

+0

Welchen targetSdk verwenden Sie? – shmakova

+0

Ihre Implementierung funktioniert tatsächlich. Ich habe Ihren Code in einer Beispielanwendung kopiert und, egal, ob ich das Mobilgerät auf dem Emulator ein- oder ausschalte, wird die Protokollnachricht des Dienstes angezeigt. – migos

Antwort

1

Von docs:

Apps die auf Android 7.0 (API-Ebene 24) und höher erhalten keine CONNECTIVITY_ACTION Sendungen, wenn sie ihre Sendung Empfänger im Manifest erklären. Apps empfangen weiterhin CONNECTIVITY_ACTION Broadcasts, wenn sie ihren BroadcastReceiver mit Context.registerReceiver() registrieren und dieser Kontext noch gültig ist.

CONNECTIVITY_ACTION = "android.net.conn.CONNECTIVITY_CHANGE";

Sie können Ihre targetSdk bis 23 oder verwenden Sie dynamische Rundfunkempfänger wie diese Herabstufung:

public class ConnectivityReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 

     boolean isConnected = ConnectionManager.isConnectedToInternet(context); 

     if (!isConnected) { 
      Toast.makeText(context, "Connected", Toast.LENGTH_SHORT).show(); 
     } 
    } 
} 

MainActivity:

public class MainActivity extends AppCompatActivity { 

    private Context mContext = this; 

    private ConnectivityReceiver mConnectivityReceiver; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     mConnectivityReceiver = new ConnectivityReceiver(); 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 

     registerReceiver(mConnectivityReceiver, new IntentFilter(
       ConnectivityManager.CONNECTIVITY_ACTION 
     )); 
    } 

    @Override 
    protected void onPause() { 
     unregisterReceiver(mConnectivityReceiver); 

     super.onPause(); 
    } 
} 
+0

App empfängt CONNECTIVITY_CHANGE, nicht CONNECTIVITY_ACTION – user1506104

+0

@ user1506104 JFYI: 'CONNECTIVITY_ACTION =" android.net.conn.CONNECTIVITY_CHANGE "; https://developer.android.com/reference/android/net/ConnectivityManager.html#CONNECTIVITY_ACTION – shmakova

+0

Sie sollte es in Ihrer Antwort für Klarheit hinzufügen – user1506104

0

Sie können versuchen, diesen Ansatz. Sie brauchen nicht eine ganz neue Klasse für Rundfunkempfänger zu machen, aber Sie können es in Ihrer Hauptaktivität wie folgt verwenden:

BroadcastReceiver receiveLocationReceiver = new BroadcastReceiver() { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     // Your custom action 
    } 

}; 

IntentFilter receiveLocationFilter = new IntentFilter(); 
receiveLocationFilter.addAction("android.intent.RECEIVE_LOCATION"); 

Registrieren Sie den Empfänger in onStart:

registerReceiver(receiveLocationReceiver, receiveLocationFilter); 

Unregister es in onStop:

unregisterReceiver(receiveLocationReceiver); 

Dann, wenn Sie die Sendung alle notwendigen senden müssen, ist:

Intent sendBroadcastIntent = new Intent("android.intent.RECEIVE_LOCATION"); 
sendBroadcast(sendBroadcastIntent); 
Verwandte Themen