Oschina 安卓client原始碼學習之中的一個

來源:互聯網
上載者:User

標籤: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原始碼學習之中的一個

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.