2013-02-15 18 views
7

Kalıcı bir internet bağlantısı gerektiren bir uygulama üzerinde çalışıyorum. İnternet bağlantısı yoksa, kullanıcının uygulamadan çıkış yapmasını istiyorum (giriş ekranına alınır). Ağ bağlantısını algılayan bir ağ alıcı sınıfım var. Bu sınıfın ya yığının üstündeki etkinliği sonlandırmak VEYA yeni bir giriş etkinliğini başlatmak ve tüm geçmiş yığınını silmek istiyorum. Başka bir sınıfın bir aktivitesini bitirme

Sorun, önalan etkinliğini alıcı sınıfımın içinden bitiremediğim ve ağ başarısız olduğunda kullanıcının hangi etkinlikte olduğunu bilmenin bir yolu yok. Ve bu sınıftan yeni bir giriş etkinliği başlatıyorsam, kullanıcı "geri" tuşuna bastığında, uygulamaya geri alınır (eğer bir ağa yeniden bağlanırsa), ancak uygulama oturum açmamış ve çökmez.

NetworkStateReceiver sınıfımdan yeni bir giriş etkinliği başlatırken myIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK || FLAG_ACTIVITY_CLEAR_TOP); kullanmayı denediniz. Ama bu işe yaramıyor, benim anlayışım için bu tek faaliyetin başladığım (oturum açma) olduğu yeni bir görev yaratıyor, ancak diğer tüm faaliyetlerle eski görev sağlam kalıyor.

yüzden gerekir:

bir şekilde konulmaya talip bir şekilde -veya bir sınıf

bir ön plan aktiviteyi bitirmek için bir sınıftan yeni bir faaliyet başlatmak ve etkinlik yığınını

boşaltma için

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); 



    } 
    } 
} 
:

İşte buna değer ne için alıcı kodÇÖZÜM: Tüm faaliyetlerinden Geçmiş referans

//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 
} 

alıcı ve onReceive() ağ alıcıda:

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

cevap

3

bir yolu, alıcıyı mevcut etkinlik için bir başvuru geçmektir (ki, onResume?). Yine de, numaralı telefondan aldığınızdan emin olun, yoksa bazı çirkin bellek sızıntılarına bakıyorsunuz. Daha sonra, 'da oturum etkinliğini başlatmadan önce curActivity.finish() (veya boşsa hiçbir şey yapmazsınız) yapabilirsiniz.

+0

Siz efendim, parlak! Mevcut aktiviteden alıcıya bir referans geçti ve işe yaradı! Teşekkürler! – Sebek

İlgili konular