2013-02-15 15 views
7

私は永続的なインターネット接続が必要なアプリで作業しています。インターネットに接続していない場合は、ユーザーをアプリからログアウトさせたい(ログイン画面に表示させる)。 ネットワーク接続を検出するネットワーク受信者クラスがあります。このクラスはスタックの上でアクティビティを終了するか、新しいログインアクティビティを開始して履歴スタック全体を削除します。別のクラスからのアクティビティの終了

問題は、受信者クラスの内部からフォアグラウンドのアクティビティを終了できず、ネットワークに障害が発生したときにユーザーがどのアクティビティを行っているかを知る方法がないことです。また、このクラスから新しいログインアクティビティを開始する場合、ユーザーが「戻る」を押すと、彼はアプリに戻ります(ネットワークに再接続した場合)。ただし、ログインしていないとクラッシュします。

NetworkStateReceiverクラスから新しいログインアクティビティを開始するときに、myIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK || FLAG_ACTIVITY_CLEAR_TOP);を試してみました。しかし、それは私の理解には、これだけの活動は私が(ログイン)を開始したが、他のすべての活動と元の仕事がそのまま残っている新しいタスクを作成し、動作しません。

は、だから私は必要があります。

方法-either方法-ORクラス

からフォアグラウンドアクティビティを完了するためにクラスから新しい活動を開始し、アクティビティスタック

を空にするために

ここで何が価値があるのための受信機のコードです:

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



    } 
    } 
} 

解決すべての活動から 合格基準は

//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()(またはnullの場合は何もしません)を行うことができます。

+0

あなたは、素晴らしいです!私は現在の活動からレシーバーに参照を渡し、それは働いた!ありがとう! – Sebek