Android再按一次完全退出程序及禁止返回上一个界面等

一、Android中的“再按一次返回键退出程序”实现

用户退出应用前给出一个提示是很有必要的,因为可能是用户并不真的想退出,而只是一不小心按下了返回键,大部分应用的做法是在应用退出去前给出一个Dialog,我觉得这样不太友好,用户还得移动手指去按dialog中的按钮。个人觉得“再按一次返回键退出程序”是best practice,实现也很简单,直接上代码: 

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(getApplicationContext(), "再按一次退出程序", Toast.LENGTH_SHORT).show();                                
            exitTime = System.currentTimeMillis();   
        } else {
            finish();
            System.exit(0);
        }
        return true;   
    }
    return super.onKeyDown(keyCode, event);
}

 

二、Android再按一次完全退出程序代码

前言:

前面使用的退出程序用的是finish(),它只能退出当前Activity。如果Activity一多就不能一次性退出了。

1、退出应用程序工具类

/**
 * 
 * @author itas109
 * TODO 用于完全退出应用程序 
 */
 
public class ExitAPPUtils extends Application {
    private List activityList = new LinkedList();
    private static ExitAPPUtils instance;
   
    private ExitAPPUtils() {
    }
   
    // 单例模式中获取唯一的ExitAPPUtils实例
    public static ExitAPPUtils getInstance() {
        if(null == instance) {
            instance =new ExitAPPUtils();
        }
        return instance;
    }
   
    // 添加Activity到容器中
    public void addActivity(Activity activity) {
        activityList.add(activity);
    }
   
    // 遍历所有Activity并finish
   
    public void exit() {
        for(Activity activity : activityList) {
            activity.finish();
        }
        System.exit(0);
    }
}

2、使用方法

在每个Activity的onCreate方法里添加如下代码

ExitAPPUtils.getInstance().addActivity(this);

3、实现再按一次完全退出效果

退出代码,放到需要退出的Activity中。

//定义时间
private long exitTime = 0;

//退出代码,放到需要退出的Activity中。

    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if(keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN){ 
            if((System.currentTimeMillis()-exitTime) > 2000){ 
                ToastUtils.show(getApplicationContext(), R.string.exit_hint);
            exitTime = System.currentTimeMillis(); 
        } else {
            ExitAPPUtils.getInstance().exit();
            //finish();
            //System.exit(0);
        }
            return true; 
        }
        return super.onKeyDown(keyCode, event);
    }
}

4、效果图

 

三、禁止返回上一个activity

有时候我们希望从一个activity离开后,按返回键不要再回去(如从登陆界面跳转后,不要再回到登陆界面),那么我们需要把这个activity从栈区中去除。考虑在activity A中调用 activity B,不允许从activity B中返回activity A:在页面跳转的时候使用下面的代码就可以了。

Intent intent=new Intent();
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setClass(A.this,B.class);
startActivity(intent);

四、Android 只开启一个Activity实例

在一个Activity中,多次调用startActivity()来启动另一个Activity,要想只生成一个Activity实例,方法有两种。 

方法一:设置起动模式 
一个Activity有四种启动模式:standard, singleTop, singleTask, singleInstance。 
standard: 标准模式,一调用startActivity()方法就会产生一个新的实例。 
singleTop: 如果已经有一个实例位于Activity栈的顶部时,就不产生新的实例,而只是调用Activity中的newInstance()方法。如果不位于栈顶,会产生一个新的实例。 
singleTask: 会在一个新的task中产生这个实例,以后每次调用都会使用这个,不会去产生新的实例了。 
singleInstance: 这个跟singleTask基本上是一样,只有一个区别:在这个模式下的Activity实例所处的task中,只能有这个activity实例,不能有其他的实例。 

这些启动模式可以在功能清单文件中进行设置,<activity>中的launchMode属性。 

方法二:在intent中加标志 
Intent.FLAG_ACTIVITY_REORDER_TO_FRONT这个标志表示:如果这个activity已经启动了,就不产生新的activity,而只是把这个activity实例加到栈顶来就可以了。 
代码如下:

Intent intent = new Intent(ReorderFour.this, ReorderTwo.class);   
intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);   
startActivity(intent);  

五、点击Home键后,在打开应用,应用会重新启动,而不是恢复到原来状态问题处理

android点击Home键后,在打开应用,应用会重新启动,而不是恢复到原来状态,在启动的actiivity中加入如下代码即可解决:

if (!isTaskRoot()) {
   finish();
   return;
}

public boolean isTaskRoot()用来判断该Activity是否为任务栈中的根Activity,即启动应用的第一个Activity。

分析:正常情况下:

比如A页面为启动页面,打开B页面,这时按home键,然后再打开app,这时会在栈中会重新创建一个A页面,然后再打开B页面。

如果加上以上的判断代码:

比如A页面为启动页面,打开B页面,这时按home键,然后再打开app,还会new 一个A页面,但是会走if条件语句,这时A页面不是在栈底,所以finish掉,然后就露出下面的B页面了。

 

 

https://www.cnblogs.com/swx2017/p/7241108.html

https://www.2cto.com/kf/201501/368155.html

https://blog.csdn.net/qq_36464448/article/details/80464075 

https://blog.csdn.net/xiangyong2008/article/details/5782674

https://blog.csdn.net/lzq520210/article/details/52331119

 

 

 

### 如何在 UniApp 中禁用页面滑动返回功能 #### Android 物理返回全局禁止 为了实现安卓设备上的物理返回全局禁止,在应用初始化可以使用 `app.mixin` 方法来监听并处理返回事件: ```javascript // main.js 或者其他入口文件 import Vue from 'vue'; Vue.mixin({ methods: { onBackPress(event) { // 阻止默认行为,即不执行返回操作 event.preventDefault(); return true; } }, created() { plus.key.addEventListener('backbutton', this.onBackPress, false); }, destroyed() { plus.key.removeEventListener('backbutton'); } }); ``` 此代码片段展示了如何利用 `app.mixin` 来拦截所有的返回按钮点击事件,并通过 `return true` 明确告知系统已处理该事件而不触发默认的行为[^1]。 #### 禁止单页面侧滑返回 对于单个页面而言,如果希望关闭其侧滑手势返回的功能,则可以通过设置当前页面 Webview 的样式属性 `popGesture` 实现这一目的: ```javascript // 页面生命周期函数内 export default { onLoad() { const page = this.$mp.page.$getAppWebview(); if (page) { page.setStyle({ popGesture: 'none' }); } } } ``` 上述 JavaScript 代码适用于 HBuilderX 编译环境下的原生插件调用方式。这段脚本会在页面加载完成后立即生效,从而达到禁用手势的效果[^2]。 #### 抖音小程序特殊处理 针对抖音平台的小程序开发场景下,当涉及到自定义右滑逻辑而不想让其触发页面切换,可采用特定 API 进行干预: ```html <template> <view class="container" @touchstart="handleTouchStart"> <!-- 组件内容 --> </view> </template> <script> export default { methods: { handleTouchStart() { tt.setSwipeBackMode(0); // 关闭右侧边缘滑动手势返回上一页模式 } } }; </script> ``` 这里展示了一个简单的模板结构以及对应的交互逻辑,其中 `tt.setSwipeBackMode()` 是由字节跳动官方提供的用于控制是否允许用户通过屏幕边缘横向拖拽的方式退出当前界面的方法[^3]。 #### 使用 Scroll-View 控制滚动行为 另外一种情况是在某些情况下需要完全锁定整个视图区域内的任何方向上的触控移动,这可以在 HTML 结构中包裹一层 `<scroll-view>` 并调整相应 CSS 属性以达成目标: ```html <template> <scroll-view scroll-x="false" scroll-y="false" style="position: absolute; bottom: 0px; top: 0px;"> <!-- 子元素 --> </scroll-view> </template> ``` 这种方法能够有效防止因误碰或其他原因造成的不必要的滚动现象发生,同也间接实现了对页面回退动作的有效抑制[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值