2014-09-25 84 views
0

已創建會話註銷功能,可以在以下情況下發生不活動註銷: 1.)存在一段不活動時間段 2.)應用程序被推入後臺,當用戶恢復應用程序時,活動仍會執行超時註銷/活動 3.)屏幕已超時並已進入屏幕保護程序模式當用戶完全退出(銷燬)應用程序時,是否可以實現會話註銷?

但是,我想知道是否有可能,當用戶完全終止應用程序退出/推入應用程序進入背景。如果可能的話,有什麼可能的實現?

這裏是代碼片段:

(功能在非活動期間撥打):

@Override 
public void onStop(){ 
    super.onStop(); 
    //Timer needs to be stopped when user manually pressed BACK button 
    //Prevent a logout when user press BACK button to stop each activity destroyed from being logged 
    startTime = System.currentTimeMillis(); 
    Log.i("RootActivity:onResume()","******startTime=******"+startTime); 
    stopDisconnectTimer(); 
} 

//METHOD USED FOR INACTIVITY LOGOUT 
//EMPLOY THE HANDLER METHOD FOR OCCURANCE OF FUTURE FUNCTION: DISCONNECTHANDLER 
public static class MyBaseActivity extends Activity { 

    public static Handler disconnectHandler = new Handler(){ 
     public void handleMessage(Message msg){ 
     } 
    }; 

} 

private Runnable disconnectCallback= new Runnable(){ 
    @Override 
    public void run(){ 
     //Get the Resume Time & get difference in Time for Logout 
     long endTime= System.currentTimeMillis(); 
     Log.i("RootActivity:onResume()","******endTime=******"+endTime); 
     long diff = endTime - startTime; 
     long secInt = (diff /1000); //conversion of milliseconds into seconds 
     Log.i("RootActivity:onRun()","******sectInt=******"+secInt); 
     if (secInt > Inactivity_Timeout){// SET EXIT SCREEN INTERVAL LOGOUT 
     IdleLogout(); 
     } 
    } 
}; 

//METHOD TO CALL ON RESETDISCONNECT WHEN USER ACTIVITY RESUMES 
public void resetDisconnectTimer(){ 
    MyBaseActivity.disconnectHandler.removeCallbacks(disconnectCallback); 
    MyBaseActivity.disconnectHandler.postDelayed(disconnectCallback, Inactivity_Timeout); 
} 

//METHOD TO CALL ON STOPDISCONNECT WHEN USER PRESS BACK BUTTON 
public void stopDisconnectTimer(){ 
    MyBaseActivity.disconnectHandler.removeCallbacks(disconnectCallback); 
} 

回答

0

中的onDestroy方法把你的註銷代碼。這種方法當用戶銷燬該應用將被稱爲 -

@Override 
protected void onDestroy() { 
    super.onDestroy(); 
    //Log out the user 
} 
+0

感謝隊友!我傻不想到 – 2014-09-25 08:03:17

+0

的OnDestroy(中)的會爲每個活動,也爲整個應用程序。我如何讓onDestroy只適用於整個應用程序,而不僅僅是活動? – 2014-09-26 02:39:49

0

採取單獨的類和擴展應用程序 作爲遵循

// *************** ************************************************** ****

public class AppController extends Application{ 


    public static final String TAG1 = "SCREEN"; 
    ConnectionDetector cd; 
    Boolean isInternetPresent = false;  
    private BroadcastReceiver scrOnReceiver; 
    private BroadcastReceiver scrOffReceiver; 
    private IntentFilter scrOnFilter; 
    private IntentFilter scrOffFilter; 
public static final String TAG = AppController.class.getSimpleName(); 

private RequestQueue mRequestQueue; 

private static AppController mInstance; 

@Override 
public void onCreate() { 
    super.onCreate(); 

// creating connection detector class instance 
    cd = new ConnectionDetector(getApplicationContext()); 
    // get Internet status 
    isInternetPresent = cd.isConnectingToInternet(); 

    new BroadcastReceiver(){ 

     @Override 
     public void onReceive(Context context, Intent intent) { 
       if (isInternetPresent) { 
        Toast.makeText(getApplicationContext(), "internet connection", Toast.LENGTH_SHORT).show(); 
       } 
       else{ 
        Toast.makeText(getApplicationContext(), "Please check the internet connection", Toast.LENGTH_SHORT).show(); 
        Intent intent1=new Intent(AppController.this,LoginActivity.class); 
        intent1.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 

        Log.d("***********", "logout"); 
       } 
     } 

    }; 





    //Fabric.with(this, new Crashlytics()); 
    mInstance = this; 

    scrOnReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      Log.d(TAG1, "SCREEN ON"); 
      timer.cancel(); 
     } 
    }; 

    scrOnFilter = new IntentFilter(Intent.ACTION_SCREEN_ON); 

    scrOffReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      Log.d(TAG1, "SCREEN OFF"); 
      timer.start(); 



     } 
    }; 

    scrOffFilter = new IntentFilter(Intent.ACTION_SCREEN_OFF); 

    registerReceiver(scrOnReceiver, scrOnFilter); 
    registerReceiver(scrOffReceiver, scrOffFilter); 
} 

public static synchronized AppController getInstance() { 
    return mInstance; 
} 

public RequestQueue getRequestQueue() { 
    if (mRequestQueue == null) { 
     mRequestQueue = Volley.newRequestQueue(getApplicationContext()); 
    } 

    return mRequestQueue; 
} 

public <T> void addToRequestQueue(Request<T> req, String tag) { 
    req.setTag(TextUtils.isEmpty(tag) ? TAG : tag); 
    getRequestQueue().add(req); 
} 

public <T> void addToRequestQueue(Request<T> req) { 
    req.setTag(TAG); 
    getRequestQueue().add(req); 
} 

public void cancelPendingRequests(Object tag) { 
    if (mRequestQueue != null) { 
     mRequestQueue.cancelAll(tag); 
    } 
} 



CountDownTimer timer = new CountDownTimer(1*60*1000, 1000) { 

    public void onTick(long millisUntilFinished) { 
     //Some code 
     Log.d("timer", "****"+millisUntilFinished); 

    } 

    public void onFinish() { 
     //Logout 
    //Intent intent=new Intent(AppController.this,TicketActivity.class); 
     //intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 

     Log.d("***********", "logout"); 
     try { 
      Intent intent = new Intent(AppController.this,ArchitectureActivity.class); 
      intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
      // startActivity(intent);   
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

    } 
}; 
@Override 
public void onTerminate() { 
    super.onTerminate(); 

    unregisterReceiver(scrOnReceiver); 
    unregisterReceiver(scrOffReceiver); 
} 

}