1x Broadcast

  • 10 Antworten
  • Letztes Antwortdatum
N

N3cron

Fortgeschrittenes Mitglied
1
Hallo zusammen. Ich bin noch nicht so gut im Coden. Hoffe Ihr könnt mir da weiter helfen. Und zwar habe ich mir ein SplashScreen gebaut und dazu soll ein Broadcastreceiver zuhören.

Mein Problem besteht darin.
Broadcast soll nur beim Start der app zuhören. Im moment startet er die App selber sobald man wifi zb aus ein schaltet.
Schreinbar hört er auch nicht auf mein unregister. Wie muss ich das ganze umbauen?

Code:
onCreate ........

  final WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
        wifi.setWifiEnabled(true);

    }

    BroadcastReceiver MyBroadcastReceiver = new BroadcastReceiver() {


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

            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
                final ConnectivityManager manager = (ConnectivityManager) getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
                final NetworkRequest.Builder builder;
                builder = new NetworkRequest.Builder();

                //set the transport type do WIFI
                builder.addTransportType(NetworkCapabilities.TRANSPORT_WIFI);

                manager.requestNetwork(builder.build(), new ConnectivityManager.NetworkCallback() {

                    @Override
                    public void onAvailable(Network network) {


                        new Handler().postDelayed(new Runnable() {

                            @Override
                            public void run() {

                                Intent i = new Intent(Splashscreen.this, MainActivity.class);
                                i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                                startActivity(i);
                                finish();


                            }
                        }, SPLASH_TIME_OUT);


                        try {

                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                        // Connectet dann nicht!?
//                        manager.unregisterNetworkCallback(this);

                    }

                });
            }

        }
    };



    @Override
    protected void onResume() {



        registerReceiver(MyBroadcastReceiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));


        super.onResume();
    }

    @Override
    protected void onPause() {
        try {

            unregisterReceiver(MyBroadcastReceiver);
        } catch (IllegalArgumentException e) {
            if (e.getMessage().contains("Receiver not registered")) {
          

            } else {
               
                throw e;

            }
        }

        super.onPause();



    }
}
 
Kurze Frage:

Möchtest du einfach beim Start, die Splashscreen beenden, wenn Wifi an ist? Und dann die MainActivity starten?
 
Ja richtig. Problem bisher war das ich das ganze im wlan ohne Internet nutze. Deshalb das mit dem lollipop und onavailable. Erst dadurch habe ich es geschafft connecten zu können ohne das er die mobilen nimmt. War ne prozedur als Anfänger. Hab es auch schon mal mit if wifi connected ausprobiert und dem connectivitymanager. Bekomme es aber nicht hin. Wifi ist nie wirklich verbunden, und schon bekommt er den Befehl weiter zu gehen. Also dachte ich mir mache ich es mit nem broadcast. Kannst du mir da helfen?

Also ja, aber nicht wenn wifi an ist oder sich verbindet. Ich brauche etwas was sagt wifi ist wirklich verbunden. Und erst dann nur über das wlan weiter macht. Das ist ja ab lollipop so ein Problem wenn er erkennt das kein Internet dahinter ist
 
Hallo zusammen. Ich habe mich nochmal dran gesetzt. Nun ist mir aufgefallen das sobald ich das app per homebutton verlasse, dann das wlan aus an schalte ich sofort wieder das hier in Android Studio angezeigt bekomme

D/ConnectivityManager.CallbackHandler: CM callback handler got msg 524295
Timeline: Activity_launch_request id:com.****.ibsbuch time:94703623

Wo muss ich denn CallBackHandler unregister? Er fragt ihn immer wieder ab. Obwohl ich schon vom Splashscreen zur MainActivity gewechselt bin.
Habe sogar schon
Intent i = new Intent(getApplicationContext(), MainActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | i.FLAG_ACTIVITY_CLEAR_TASK);
ausgeführt. Dann sollten ja wenn ich es richtig verstehe alle Activity´s dahinter geschlossen sein


Hier mal wie ich es ohne Broadcast probiere

Code:
        final WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
        wifi.setWifiEnabled(true);


        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
          manager = (ConnectivityManager) getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
            final NetworkRequest.Builder builder;

            builder = new NetworkRequest.Builder();

            //set the transport type do WIFI
            builder.addTransportType(NetworkCapabilities.TRANSPORT_WIFI);

            manager.requestNetwork(builder.build(), new ConnectivityManager.NetworkCallback() {

                @Override
                public void onAvailable(Network network) {
                   connMan = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);

                    NetworkInfo netInfo = connMan.getActiveNetworkInfo();
                    if (netInfo != null && netInfo.isConnected()) {

                        try {
                            URL urlServer = new URL("http://www.google.de");

                            HttpURLConnection urlConn = (HttpURLConnection) urlServer.openConnection();
                            urlConn.setConnectTimeout(5000); //<- Seconds Timeout
                            urlConn.connect();
                            Toast.makeText(getApplicationContext(), "" + urlConn,
                                    Toast.LENGTH_LONG).show();

                            if (urlConn.getResponseCode() == 200) {

                                new Handler().postDelayed(new Runnable() {
                                    //
                                    @Override
                                    public void run() {

                                        Intent i = new Intent(Splashscreen.this, MainActivity.class);
                                        startActivity(i);
                                        finish();


                                    }
                                }, SPLASH_TIME_OUT);
                            } else {

                            }
                        } catch (MalformedURLException e1) {
//                            manager.unregisterNetworkCallback(this);
//                            connMan.unregisterNetworkCallback(this);
                        } catch (IOException e) {

                        }
                    }

                }
            });
        }
    }
 
Zuletzt bearbeitet:
Du muss den ConnectivityManager in onPause() unregister. Sonst erhält der ConnectivityManager eine Referenz auf die Activity, und erhält sie damit am Leben (eine klassische Insel).

Dafür braucht du die Methode unregisterNetworkCallback (ConnectivityManager.NetworkCallback networkCallback) aufrufen.

Dafür darf dein Callback keine anonyme Klasse mehr sein, das heißt du solltest ihn am besten immer onResume() einen Attribut deiner Klasse zuweisen.

ConnectivityManager | Android Developers
 
Hi umd vuelen Dank erstmal. Bezieht sich deine Antwort auf meinen ersten code mit dem broadcastreceiver oder auf den unteren? Ok das mitm connectivitymanager habe ich verstanden.

Kannst du mir das bitte genauer erklären mit dem Attribut der Klasse zuweisen. Weiss da gerade nicht was du meinst.

Vielen Dank
 
Zum Beispiel:

Code:
public class MyActivity{

private ConnectivityManager.NetworkCallback mNetworkCallback = new ConnectivityManager.NetworkCallback(){
...
}

....

manager.requestNetwork(builder.build(), mNetworkCallback);
....

@Override
protected void onPause() {

if (manager != null)
    manager.unregister(mNetworkCallback);
}



}
 
Hi. Vielen Dank! Leider bekomme ich es nicht hin.
Es macht gerade einfach nicht klick.

Das ganze mit oder ohne Broadcast? Also so wie der erste oder zweite Code?

Danke dir
 
Hi Markus. Ich weiss nicht das so ok ist, aber es scheint zu funktionieren und zwar habe ich folgendes eingefügt. Ist denke ich nicht die feine art, bekomme den NetworkCallback aber nicht unregister. Falls du weisst wie, wäre es super wenn du es mir zeigen und erklären könntest. Habe als Anfänger schon so einiges hinbekommen, aber seid ich versuche eine verbindung per Wifi ohne Internet herzustellen stehe ich aufm schlauch.
In einer anderen App von mir brauchte ich das auch. Nie hinbekommen. Ich hoffe du bringst licht in die Sache

Vielen Dank

Code:
@Override
                    public void onAvailable(Network network) {


                        new Handler().postDelayed(new Runnable() {

                            @Override
                            public void run() {

                                Intent i = new Intent(Splashscreen.this, MainActivity.class);
                                i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                                startActivity(i);
                               
///////////////////////////////////////
int pid = android.os.Process.myPid();
                                android.os.Process.killProcess(pid);
//////////////////////////////////////////
                                finish();


                            }
                        }, SPLASH_TIME_OUT);
 
Hallo @N3cron,

ich habe mir deine letzte Lösung nicht genau angesehen, aber android.os.Process.killProcess(pid); ist eine Lösung mit der Brechstange. Ich habe mal kurz was geschrieben, habe es nicht getestet, aber es müsste eigentlich funktionieren.


Code:
public class Splashscreen extends AppCompatActivity {

    private NetworkMonitorReceiver receiver;

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


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

        this.receiver = new NetworkMonitorReceiver();

        this.registerReceiver(this.receiver, new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE"));

    }

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

        this.unregisterReceiver(this.receiver);
    }

    private class NetworkMonitorReceiver extends BroadcastReceiver {

        private final String TAG = NetworkMonitorReceiver.class.getSimpleName();

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

            ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
            if (networkInfo != null && networkInfo.isConnected()) {
               
                if(networkInfo.getType() == ConnectivityManager.TYPE_WIFI) {

                    Intent i = new Intent(Splashscreen.this, MainActivity.class);
                    startActivity(i);
                    finish();
                } else
                    finish();
               
            } else {
                Log.d(TAG, "Network is not available");
                finish();
            }

        }

    }
}
 
Vielen Dank Markus. Ich muss leider jetzt richtung Arbeit. Werde es mir aber am Wochenende anschauen und melde mich sobald ich es getestet habe. Schreibe dich dann Privat an.

Danke!!
 
Zurück
Oben Unten