天天看点

android 如何优雅的退出App

android 退出App也是一门艺术,很多App都是直接使用system.exit(0)的方法直接退出的,这样的话会给用户带来不好的体验,而且不能正确释放内存,用户还以为是App闪退了呢。那如何做到退出不给用户一种闪退的感觉呢?

按照这种方法实现,简单实用。App退出后也不会自动重启。

1:首先是在application类中定义好需要的方法和实例

public class MyApplication extends Application {
    /**
     * 打开的activity
     **/
    private List<BaseActivity> activities = new ArrayList<>();

    /**
     * 应用实例
     **/
    private static MyApplication instance;

    /**
     * 获得实例
     *
     * @return
     */
    public static MyApplication getInstance() {
        return instance;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        instance = this;
    }

 
    /**
     * 应用退出,结束所有的activity
     */
    public void exit() {
        for (BaseActivity activity : activities) {
            if (activity != null) {
                activity.finish();
            }
        }
        //释放内存,退出程序
        android.os.Process.killProcess(android.os.Process.myPid());
    }

    /**
     * 新建了一个activity就加入到集合中
     *
     * @param activity
     */
    public void addActivity(BaseActivity activity) {
        activities.add(activity);
    }
}
           

解释:

a):可以看到我们把application变成了一个单例 ,并且封装了添加activity的addActivity()和退出App exit()方法。

b):其次这里的baseActivity就是我们自己封装的好的,主要是封装一些常用方法,比如弹窗,打印等等。。让我们的activity都继承这个基类吧。让后把我们在application中封装好的方法用进去,如下

public class BaseActivity extends FragmentActivity {


    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //获取application实例,把每个继承此activity的方法都加进去
        MyApplication.getInstance().addActivity(this);
    }
}
           

2:最后在我们的maiActivity中重写如下方法就大功告成啦!

/**
     * 上一次按返回键的时间
     */
    private long mExitTime;

/**
     * 监听退出按键
     *
     * @param keyCode
     * @param event
     * @return
     */
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            // 判断两次点击的时间间隔(默认设置为2秒)
            if ((System.currentTimeMillis() - mExitTime) > 2000) {
                showToast("再按一次退出程序"));
                mExitTime = System.currentTimeMillis();
            } else {
                MyApplication.getInstance().exit();  //完美退出程序
            }
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }
           

3:别忘加在AndroidManifest.xml中添加自定义的application哦!

<application
        android:name=".application.MyApplication"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".activity.StartActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>