標籤:pos 延遲 exce lib bool class over gen 程式
今天主要研究一下兩個功能
(1)雙擊返回鍵退出程式
(2)接近完美地退出程式
(1)
在非常多應用程式裡都有一個功能,就是點擊返回鍵,之後提示你再點擊返回鍵就退出程式。
之前一直非常好奇這是怎麼實現的,今天正好把開源中國安卓client原始碼扒下來了,所以就在這裡研究一下這個非常easy的功能。
public class DoubleClickExitHelper {private final Activity mActivity;private boolean isOnKeyBacking;private Handler mHandler;private Toast mBackToast;public DoubleClickExitHelper(Activity activity) {mActivity = activity;mHandler = new Handler(Looper.getMainLooper());//關鍵之處}/** * Activity onKeyDown事件 * */public boolean onKeyDown(int keyCode, KeyEvent event) {if(keyCode != KeyEvent.KEYCODE_BACK) {return false;}if(isOnKeyBacking) {mHandler.removeCallbacks(onBackTimeRunnable);if(mBackToast != null){mBackToast.cancel();}// 退出AppManager.getAppManager().AppExit(mActivity);return true;} else {//isOnKeyBacking 預設值為 false。所以第一次點擊進入這裡//java boolean型是有預設值的isOnKeyBacking = true;if(mBackToast == null) {mBackToast = Toast.makeText(mActivity, R.string.back_exit_tips, 2000);}mBackToast.show();mHandler.postDelayed(onBackTimeRunnable, 2000);return true;}}private Runnable onBackTimeRunnable = new Runnable() {@Overridepublic void run() {isOnKeyBacking = false;if(mBackToast != null){//Android中用Toast.cancel()方法最佳化toast內容的顯示//詳細能夠百度mBackToast.cancel();}}};
簡單來理解就是監聽返回鍵。第一次按下的時候。用mBackToast.show();顯示一個提示文字。
這裡是“再按一次退出開源中國”。期間2000ms。
同一時候用這個mHandler.postDelayed開啟一個非同步作業,延遲時間也是2000ms。也就是說文字消失的時候這個RunnableonBackTimeRunnable就會去調用run方法。isOnKeyBacking的值變為false。也就是說2s之後你的第二次點擊沒有操作的話。一切回到原點。
而假設你一旦在2s內再次點擊的的話。
AppManager.getAppManager().AppExit(mActivity);
程式就退出了。
使用的時候呢
mDoubleClickExitHelper=newDoubleClickExitHelper(this);
在須要支援這個雙擊退出的activity裡,把onkeydown事件往下分發:
/** * 監聽返回--是否退出程式 */public boolean onKeyDown(int keyCode, KeyEvent event) {boolean flag = true;if (keyCode == KeyEvent.KEYCODE_BACK) {// 是否退出應用return mDoubleClickExitHelper.onKeyDown(keyCode, event);} else if (keyCode == KeyEvent.KEYCODE_MENU) {// 展示快捷欄&推斷是否登入UIHelper.showSettingLoginOrLogout(Main.this,mGrid.getQuickAction(0));mGrid.show(fbSetting, true);} else if (keyCode == KeyEvent.KEYCODE_SEARCH) {// 展示搜尋網頁UIHelper.showSearch(Main.this);} else {flag = super.onKeyDown(keyCode, event);}return flag;}
這樣就實現了整個功能。
(2)接近完美地退出程式
接下來呢,就分析一下開源中國client這個退出功能。即上文
AppManager.getAppManager().AppExit(mActivity);這個函數的實現
private static Stack<Activity> activityStack;/** * 退出應用程式 */public void AppExit(Context context) {try {finishAllActivity();ActivityManager activityMgr= (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);//android2.2之後應該用killBackgroundProcesses (String packageName)activityMgr.restartPackage(context.getPackageName());System.exit(0);} catch (Exception e) {}}/** * 結束全部Activity */public void finishAllActivity(){for (int i = 0, size = activityStack.size(); i < size; i++){ if (null != activityStack.get(i)){ activityStack.get(i).finish(); } }activityStack.clear();}
貼出關鍵原始碼大家就明確了吧。有個存放app全部activity的stackactivityStack;
當然加入activity的原始碼沒貼出來。
在應用程式退出的時候呢,就是遍曆一下這個stack。然後挨個調用finish()。最後再調用System.exit(0);優雅的。全然的結束掉整個程式。
Oschina 安卓client原始碼學習之中的一個