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>