2013-02-15 39 views
7

Tôi đang làm việc trên một ứng dụng yêu cầu kết nối internet vĩnh viễn. Nếu không có kết nối internet, tôi muốn người dùng đăng xuất khỏi ứng dụng (được đưa tới màn hình đăng nhập). Tôi có một lớp người nhận mạng phát hiện kết nối mạng. Tôi muốn lớp này chấm dứt hoạt động ở trên cùng của ngăn xếp HOẶC để bắt đầu một hoạt động đăng nhập mới và xóa toàn bộ ngăn xếp lịch sử.Hoàn thành hoạt động từ một lớp học khác

Vấn đề là tôi không thể hoàn thành hoạt động tiền cảnh từ bên trong lớp người nhận của mình, và không có cách nào biết được hoạt động của người dùng khi có mạng bị lỗi. Và nếu tôi bắt đầu hoạt động đăng nhập mới từ lớp này, khi người dùng nhấn "quay lại", anh ta sẽ được đưa trở lại ứng dụng (nếu anh ấy kết nối lại với mạng) nhưng ứng dụng chưa đăng nhập và bị treo.

Đã thử sử dụng myIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK || FLAG_ACTIVITY_CLEAR_TOP); khi bắt đầu hoạt động đăng nhập mới từ lớp NetworkStateReceiver của tôi. Nhưng nó không hoạt động, với sự hiểu biết của tôi, điều này tạo ra một nhiệm vụ mới trong đó hoạt động duy nhất là hoạt động tôi bắt đầu (đăng nhập), nhưng nhiệm vụ cũ với tất cả các hoạt động khác vẫn còn nguyên vẹn.

Vì vậy, tôi cần:

-either một cách để kết thúc một hoạt động foreground từ một lớp

-Hoặc một cách để bắt đầu một hoạt động mới từ một lớp và đổ hoạt động ngăn xếp

Dưới đây là mã nhận cho những gì nó có giá trị:

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: Qua tham khảo từ mọi hoạt động đến người nhận

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

và nhận mạng trong onReceive():

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

Trả lời

3

Một cách là để vượt qua người nhận một tham chiếu đến các hoạt động hiện tại (ví dụ, trong onResume?). Hãy chắc chắn để null nó trong , mặc dù, hoặc bạn đang tìm kiếm một số rò rỉ bộ nhớ xấu xí. Sau đó, trong onReceive, bạn có thể curActivity.finish() (hoặc không phải làm gì nếu nó rỗng) trước khi bạn bắt đầu hoạt động đăng nhập.

+0

Bạn thưa ngài, thật tuyệt vời !! Tôi đã thông qua một tài liệu tham khảo từ các hoạt động hiện tại cho người nhận và nó đã làm việc! Cảm ơn! – Sebek

Các vấn đề liên quan