Android中優(yōu)雅的退出程序

Android 中退出程序有很多種方法,如建立一個(gè)全局容器,把所有的Activity存儲(chǔ)起來,退出時(shí)循環(huán)遍歷finish所有Activity;用廣播的方式退出;雙擊兩次返回鍵退出應(yīng)用。

建立全局容器

每次啟動(dòng)Activity都添加到容器內(nèi),當(dāng)退出程序時(shí)可以結(jié)束所有Activity。


public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 添加Activity到堆棧
        ActivityContainer.getInstance().addActivity(this);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // 結(jié)束Activity從棧中移除該Activity
        ActivityContainer.getInstance().removeActivity(this);
    }

}


Activity 容器

class ActivityContainer {

    private ActivityContainer() {
    }

    private static ActivityContainer instance = new ActivityContainer();
    private static List<Activity> activityStack = new ArrayList<Activity>();

    public static ActivityContainer getInstance() {
        return instance;
    }

    public void addActivity(Activity activity) {
        activityStack.add(activity);
    }

    public void removeActivity(Activity activity) {
        activityStack.remove(activity);
    }

    /**
     * 結(jié)束所有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();
    }

}

這種方法比較簡單, 但是可以看到activityStack持有這Activity的強(qiáng)引用,也就是說當(dāng)某個(gè)Activity異常退出時(shí),activityStack沒有即使釋放掉引用,就會(huì)導(dǎo)致內(nèi)存問題,

廣播式

通過在BaseActivity中注冊(cè)一個(gè)廣播,當(dāng)退出時(shí)發(fā)送一個(gè)廣播,finish退出。


public class BaseActivity extends Activity {

   private static final String EXITACTION = "action.exit";

   private ExitReceiver exitReceiver = new ExitReceiver();

   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       IntentFilter filter = new IntentFilter();
       filter.addAction(EXITACTION);
       registerReceiver(exitReceiver, filter);
   }

   @Override
   protected void onDestroy() {
       super.onDestroy();
       unregisterReceiver(exitReceiver);
   }


   class ExitReceiver extends BroadcastReceiver {

       @Override
       public void onReceive(Context context, Intent intent) {
           BaseActivity.this.finish();
       }

   }

}

雙擊兩次返回鍵退出

重寫onKeyDown方法


 private long exitTime = 0;

 @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN) {
           //兩秒之內(nèi)按返回鍵就會(huì)退出
            if ((System.currentTimeMillis() - exitTime) > 2000) {
                Toast.makeText(getApplicationContext(), "再按一次退出程序", Toast.LENGTH_SHORT).show();
                exitTime = System.currentTimeMillis();
            } else {
                finish();
                System.exit(0);
            }
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }

以上三種是比較常用的幾種退出應(yīng)用程序的方式,具體還要根據(jù)項(xiàng)目來選擇合適的退出方式。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容