Android启动页跳转与连续点击退出程序

 

在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); 
}

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值