2013-02-15 35 views
7

Ich arbeite an einer App, die eine permanente Internetverbindung benötigt. Wenn keine Internetverbindung vorhanden ist, möchte ich, dass der Benutzer von der App abgemeldet wird (auf dem Anmeldebildschirm). Ich habe eine Netzwerk-Empfänger-Klasse, die Netzwerkkonnektivität erkennt. Ich möchte, dass diese Klasse entweder die Aktivität oben auf dem Stapel beendet ODER eine neue Anmeldeaktivität startet und den gesamten Verlaufsstapel löscht.Beenden einer Aktivität aus einer anderen Klasse

Das Problem ist, dass ich die Vordergrundaktivität nicht innerhalb meiner Empfängerklasse beenden kann, und es gibt keine Möglichkeit zu wissen, in welcher Aktivität sich der Benutzer befindet, wenn ein Netzwerkfehler auftritt. Und wenn ich eine neue Anmeldeaktivität von dieser Klasse starte, wenn der Benutzer "zurück" drückt, wird er zurück zur App gebracht (wenn er sich wieder mit einem Netzwerk verbindet), aber die App ist nicht eingeloggt und stürzt ab.

Versucht mit myIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK || FLAG_ACTIVITY_CLEAR_TOP); beim Starten einer neuen Anmeldeaktivität von meiner Klasse NetworkStateReceiver. Aber es funktioniert nicht, nach meinem Verständnis schafft das eine neue Aufgabe, bei der die einzige Aktivität die ist, die ich gestartet habe (Login), aber die alte Aufgabe mit all den anderen Aktivitäten bleibt intakt.

Also ich brauche:

-entweder Weise eine Vordergrundaktivität aus einer Klasse

-oder eine Art und Weise zu beenden, eine neue Tätigkeit von einer Klasse zu starten und Entleeren der Aktivität Stapel

Hier ist der Empfängercode für das, was es wert ist:

public class NetworkStateReceiver extends BroadcastReceiver{ 
public void onReceive(Context context, Intent intent) { 
//  super.onReceive(context, intent); 
Log.d("app","Network connectivity change"); 
if(intent.getExtras()!=null) { 
    Login.apiKey = null; 
    NetworkInfo ni=(NetworkInfo) intent.getExtras().get(ConnectivityManager.EXTRA_NETWORK_INFO); 
    if(ni!=null && ni.getState()==NetworkInfo.State.CONNECTED) { 
     Log.i("app","Network "+ni.getTypeName()+" connected"); 
    } 
} 
if(intent.getExtras().getBoolean(ConnectivityManager.EXTRA_NO_CONNECTIVITY,Boolean.FALSE) && !Login.loginActive) { 
     Log.d("app","There's no network connectivity"); 

     Toast.makeText(context, "No internet connection. Logging out", Toast.LENGTH_LONG).show(); 
     //logout 
     Receiver.engine(context).halt(); 
     Receiver.mSipdroidEngine = null; 
     Receiver.reRegister(0); 
     new Thread(ChatList.runnable).interrupt(); 
     ChatList.buddyList.clear(); 
     Login.apiKey = null; 
     Log.i("Logout", "Logged out!"); 
     Login.loggedOut = true; 


     Intent myIntent = new Intent(context, Login.class); 
     myIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); 
//   myIntent.addFlags(Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP); 
     context.startActivity(myIntent); 



    } 
    } 
} 

LÖSUNG: von allen Aktivitäten Bestanden Referenz

//random user_activity 
    @Override 
protected void onPause() { 
    super.onPause(); 
    NetworkStateReceiver.curActivity = null; 
} 


@Override 
protected void onResume() { 
    super.onResume(); 
    NetworkStateReceiver.curActivity = user_activity.this; //edited : getParent() doesn't always work 
} 

und in Netzwerk-Receiver in onReceive() an den Empfänger:

  if(curActivity != null) 
     { 
      curActivity.finish(); 
    } 

Antwort

3

Eine Möglichkeit, den Empfänger einen Verweis auf die aktuelle Aktivität passieren ist (sagen wir, in onResume?). Stellen Sie jedoch sicher, dass Sie es in auf Null setzen, oder Sie sehen sich einige hässliche Speicherlecks an. Dann können Sie in onReceivecurActivity.finish() (oder nichts tun, wenn es null ist), bevor Sie die Login-Aktivität starten.

+0

Sie Herr, sind brilliant !! Ich habe eine Referenz von der aktuellen Aktivität an den Empfänger übergeben und es hat funktioniert! Vielen Dank! – Sebek

Verwandte Themen