android.net.conn.CONNECTIVITY_CHANGE is deprecated - Welche Alternativen gibt es?

  • Antworten:8
Jakob N.
  • Forum-Beiträge: 282

29.08.2017, 21:47:12 via Website

Hallo Leute,

ich verwende in meiner Android-App einen BroadcastReceiver mit der Intent-Filter Action "android.net.conn.CONNECTIVITY_CHANGE". Genauer geht es darum, dass ich wenn keine Internet-Verbindung besteht nicht direkt meine MySQL-Datenbank (bzw PHP-Skript) anspreche, sondern in eine lokale SQLite-Datenbank inserte. Und im BroadcastReceiver (wenn ich wieder eine Internet-Verbindung habe) inserte ich dann in die MySQL-Datenbank. Im Receiver unterscheide ich auch noch, ob eine WLAN-Verbindung besteht, da es eine User-Einstellung gibt, die besagt, dass nur bei WLAN-Verbindung synchronisiert werden darf.

Leider gibt es in den neueren Android-Versionen den Intent-Action-Filter nicht mehr.
Jetzt zu meinem Problem: Ich finde keine Variante, in der ich ohne dass meine App gerade läuft, die Netzwerkstatus-Änderungen mitbekomme. Ich würde gerne meine App für die neueren Androidversionen wieder volleinsatzfähig machen, ohne dieser Änderung jedoch leider nicht möglich.

Ich hoffe ihr könnt mir helfen!

LG Jakob

LG Jakob

Antworten
Jakob N.
  • Forum-Beiträge: 282

29.08.2017, 22:30:03 via Website

Hallo,

danke für die schnelle Rückmeldung!

Verstehe ich richtig, dass ich hierfür nur "registerNetworkCallback" verwenden muss?
Startet dieser dann ein Service? und meine App muss nicht gerade ausgeführt werden?

LG

LG Jakob

Antworten
swa00
  • Forum-Beiträge: 3.704

29.08.2017, 22:35:35 via Website

Hallo Jakob,

ich glaube du verwechselst jetzt Service mit Broadcastreceiver.

Das obige ist lediglich ein Broadcastreceiver , der dir in einen Callback bei Statuswechsel zurück gibt .
(onReceive)

Ob du den dann in einen Service bastelst , obliegt Dir.

— geändert am 30.08.2017, 08:42:44

Liebe Grüße - Stefan
[ App - Entwicklung ]

Antworten
Jakob N.
  • Forum-Beiträge: 282

29.08.2017, 23:04:15 via Website

Hallo,

ja entschuldigung meinte natürlich den Broadcastreceiver.
Danke für den Tipp, ich werde es die Woche mit dem ConnectivityManager testen.

LG

LG Jakob

Antworten
Jakob N.
  • Forum-Beiträge: 282

04.09.2017, 21:40:16 via Website

Hallo,

leider habe ich es nicht geschafft den Callback laufen zu kriegen.

Hier mein Code:
ConnectivityManager connectivityManager = getSystemService(ConnectivityManager.class);
if (connectivityManager != null) {
NetworkRequest.Builder networkRequestBuilder = new NetworkRequest.Builder();
PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, new Intent(getApplicationContext(), NetworkChangeReceiver.class), 0);
connectivityManager.registerNetworkCallback(networkRequestBuilder.build(), pendingIntent);
}

Der NetworkCahngeReceiver ist als receiver im Manifest eingetragen und überprüft auf keine speziellen Flags.

Weißt du was ich falsch mache?

LG Jakob

LG Jakob

Antworten
swa00
  • Forum-Beiträge: 3.704

04.09.2017, 22:29:44 via Website

Hallo Jakob

du benutzt auch quasi nur die Hälfte , was benötigt wird
.

Hier ein Schnipsel aus meinem Code

public class NetworkChangeReceiver {

private Activity mActivity;
private _int_NetworkChangeReceiver mNetworkChangeReceiver;
private OnStatusListener   onStatusListener;
private Boolean mMobile = false;
private Boolean mWifi = false;
private Boolean mConnected = false;

private String  mCarrier = "";
private String  mState = "";


////////////////////////////////////////////////////////////////////////////////////////
public interface OnStatusListener
{
    public void onStatusChanged(Boolean connected, Boolean wifi,Boolean mobile,String Carrier,String state);
}
////////////////////////////////////////////////////////////////////////////////////////
public void setOnStatusListener(OnStatusListener listener)
{
    onStatusListener = listener;
}
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////
public NetworkChangeReceiver(Activity a)
{
    mActivity = a;

}
///////////////////////////////////////////////////////////////////////
public void register()
{
    IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
    mNetworkChangeReceiver = new _int_NetworkChangeReceiver();
    mActivity.registerReceiver(mNetworkChangeReceiver, filter);
}
///////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////
public void unregister()
{
    mActivity.unregisterReceiver(mNetworkChangeReceiver);
}
///////////////////////////////////////////////////////////////////////
public class _int_NetworkChangeReceiver extends BroadcastReceiver
{

    @Override
    public void onReceive(final Context context, final Intent intent) {
        mActivity = (Activity) context;
        ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);

        NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
        if (null != activeNetwork) {
            mCarrier = activeNetwork.getExtraInfo();
            mState   = activeNetwork.getState().toString();
            if (activeNetwork.getType() == ConnectivityManager.TYPE_WIFI)
            {
                mWifi  = true;
                mMobile = false;
                mConnected = true;
                if (onStatusListener != null) onStatusListener.onStatusChanged(mConnected,mWifi,mMobile,mCarrier,mState);
                return;
            }

            if (activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE)
            {
                mWifi   = false;
                mMobile = true;
                mConnected = true;
                if (onStatusListener != null) onStatusListener.onStatusChanged(mConnected,mWifi,mMobile,mCarrier,mState);
                return;
            }
        }
        mConnected = false;
        if (onStatusListener != null) onStatusListener.onStatusChanged(mConnected,mWifi,mMobile,mCarrier,mState);
    }

}

}

Verwendung :

mNetworkChangeReceiver = new NetworkChangeReceiver(mActivity);
mNetworkChangeReceiver.setOnStatusListener(new NetworkChangeReceiver.OnStatusListener()
{
  @Override
  public void onStatusChanged(Boolean connected, Boolean wifi, Boolean mobile, String carrier, String state)
  {
   Log.d ("XXX","NETWORK : "+ connected + " / "+ wifi + " / "+ mobile + " / "+ carrier + " / "+ state);
  }
});
mNetworkChangeReceiver.register();

— geändert am 04.09.2017, 23:47:59

Liebe Grüße - Stefan
[ App - Entwicklung ]

Ludy

Antworten
Jakob N.
  • Forum-Beiträge: 282

05.09.2017, 20:11:32 via Website

Hallo,

der NetworkChangeReceiver funktioniert aber nur solange die App auch läuft oder?
Wenn der App aus dem Speicher gewischt wird, funktioniert es nicht mehr.

Habe ich das richtig verstanden?
Ich hätte gerne eine Lösung, die immer die Netzwerkänderungen mitbekommt und an meine App schickt.

LG Jakob

LG Jakob

Antworten
swa00
  • Forum-Beiträge: 3.704

05.09.2017, 21:34:50 via Website

Hallo Jakob,

ich hatte bereits oben erwähnt, dass du Dir dazu einen Service/Process schreiben musst.

http://www.vogella.com/tutorials/AndroidServices/article.html

— geändert am 06.09.2017, 08:44:48

Liebe Grüße - Stefan
[ App - Entwicklung ]

Antworten