2013-02-15 121 views
7

我正在研究需要永久性互聯網連接的應用程序。如果沒有互聯網連接,我想讓用戶註銷應用程序(轉到登錄屏幕)。 我有一個網絡接收器類,檢測網絡連接。我希望這個類要麼終止堆棧頂部的活動,要麼開始一個新的登錄活動並刪除整個歷史堆棧。正在完成其他課程的活動

問題是我無法從我的接收器類中完成前臺活動,並且沒有辦法知道當網絡出現故障時用戶處於哪個活動狀態。如果我從這個類開始一個新的登錄活動,當用戶按下「返回」時,他將被帶回應用程序(如果他重新連接到網絡),但該應用程序未登錄並崩潰。

嘗試使用myIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK || FLAG_ACTIVITY_CLEAR_TOP);從我的NetworkStateReceiver類開始新的登錄活動時。但它不起作用,根據我的理解,這創建了一項新任務,其中唯一的活動就是我開始(登錄)的活動,但其他所有活動的舊任務仍保持不變。

所以我需要:

- 或者一個方法來從一個類

完成一個前臺活動 - 或者一個方式開始從一類新的活動和排空活動堆棧

下面是它的價值的接收器代碼:

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



    } 
    } 
} 

SOLUTION:從所有活動 傳遞參照接收機

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

和在網絡接收機中onReceive()

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

回答

3

的一種方式是通過接收器到當前活動的基準(比如,在onResume?)。不過,請確保在中將其清零,否則您正在查看一些醜陋的內存泄漏。然後,在開始登錄活動之前,在onReceive中,您可以curActivity.finish()(或者,如果它爲空,則不執行任何操作)。

+0

你先生,很棒!我將當前活動的參考文件傳遞給接收方,並且工作正常!謝謝! – Sebek 2013-02-15 14:52:36