在Android开发中,启动页与退出程序是大部分程序员都会做的一个小模块,根据之前踩过的坑,特此记录一下,一方面自己下次查阅方便,另一方面希望可以分享一下,水平有限,错误之处,还请多提宝贵意见.
我的测试的程序是 从启动页停留两秒---->>跳转到 MainActivity, 在MainActivity页面,在2秒内连续点击底部返回键两次,退出程序
问题1:启动页跳转主页面,主页面连续点击两次底部返回键退出程序
步骤:
1. 启动页跳转主页面后,在startActivity(intent)后加入finish()结束启动页活动;
startActivity(new Intent(this, MainActivity.class));
finish();
2. 启动页活动不要继承AppCompatActivity,继承Activity或FragmentActivity都可以;
public class StartupActivity extends FragmentActivity(或Activity)
3. 启动页设置主题为:@android:style/Theme.Translucent.NoTitleBar 或者@android:style/Theme.Light.NoTitleBar.Fullscreen;
<style name="start_style" parent="@android:style/Theme.Translucent.NoTitleBar">
</style>
4. 在主页面重写onBackPressed方法,设置点击时间间隔, 当结束程序时,调用finish()方法(见下文---第一种方式).
遇到的坑:
第一个坑: 使用onBackPressd方法结束,,APP退出时有明显的闪烁(同样的onBackPressed方法,别人的APP退出动画显示很平滑)
解决办法: 为启动页设置主题为: @android:style/Theme.Translucent.NoTitleBar
第二个坑: 为启动页设置主题为: @android:style/Theme.Translucent.NoTitleBar ,程序运行立刻崩溃(反复崩溃,让人头大)
解决办法: 这种情况是因为你的Activity继承的是AppCompatActivity,将其换成Activity或FragmentActivity即可.
第三个坑: 连续点击两次返回键,竟然退回到了启动页
解决办法:在使用Intent进行页面跳转(启动页跳转到主页面)时,在startActivity(intent)后添加finish()方法,销毁启动页的活动.
这样连续点击两次返回键,就直接退出程序了.
实现方式一:在需要结束APP的Activity中重写onBackPress()方法
private long exitTime = 0;
@Override
public void onBackPressed() {
if (System.currentTimeMillis() - exitTime > 2000) {
exitTime = System.currentTimeMillis();
Toast.makeText(this, "再按一次返回键退出程序", Toast.LENGTH_SHORT).show();
} else {
finish();
}
}
第二种方式: 源自 郭霖老师 ---《第一行代码》
使用ActivityCollector管理所有的Activity,在管理类中添加三个方法,分别为添加、移除、结束所有Actiivity,
同时使得所有Activity继承自BaseActivity;
Activity管理类如下:
public class ActivityCollectorUtil {
public static List<Activity> activities = new ArrayList<>();
public static void addActivity(Activity activity) {
activities.add(activity);
}
public static void removeActivity(Activity activity) {
activities.remove(activity);
}
public static void finishAll() {
for (Activity activity : activities) {
if (!activity.isFinishing()) {
activity.finish();
}
}
android.os.Process.killProcess(android.os.Process.myPid());
}
}
在BaseActivity的onCreate()方法中,添加: ActivityCollector.add(this);
在onDestory()方法中,添加ActivityCollector.remove(this); (在super方法后添加)
这样,就在想要结束程序的地方直接调用:ActivityCollector.finishAll()方法即可.
第三种方式:使用onKeyDown方法
private long exitTime = 0;
/**
* 首页两秒之内连续点击返回键,退出程序
*/
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN) {
if ((System.currentTimeMillis() - exitTime) > 2000) {
Toast.makeText(this, "再按一次退出程序", Toast.LENGTH_SHORT).show();
exitTime = System.currentTimeMillis();
} else {
finish();
System.exit(0);//会造成闪屏的情况,可以去掉
}
return true;
}
return super.onKeyDown(keyCode, event);
}
直接放在你要连续两次返回退出程序的 Activity即可.
问题2:重写dispatchKeyEvent方法 按返回键back 执行两次的解决方法,导致返回提示框出现两个
解决方法:
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
if(event.getKeyCode() == KeyEvent.KEYCODE_BACK
&& event.getAction() != KeyEvent.ACTION_UP) {//不响应按键抬起时的动作
//自己的逻辑
}
return super.dispatchKeyEvent(event);
}