Android超时退出功能解决方案

一些App鉴于安全性的考虑可能需要用户长时间不操作退出登陆界面的功能,百度各种方法,但是限于本身框架原因均无法实现

我的App框架是viewPager+fragment,而且每个fragment页面还嵌套了viewpager+fragment。由于需要禁止viewpager的左右滑动,改用点击按钮切换页面,所以viewPager自定义以便于禁止左右滑动,代码如下:

布局里引用这个ViewPager将禁止viewpager的左右滑动。这样如果要实现退出登陆提醒那就这么做。定义一个全局变量time获取当前时间,每次用户操作屏幕的时候都更新time,由于禁止了左右滑动,所以在主Activity中对viewPager添加点击事件会被阻止,为此只能在viewpager阻止滑动事件之前更新time变量。这样监听超时的操作只能通过Service实现。因为Activity里面无论你对viewpager还是页面的布局监听点击事件均会被阻止。 Service的方法如下: > public class TimeOutService extends Service { private MessageDialog exitInput; private String TAG = "TimeOutService"; public static boolean isTimeout; private Context mContext; private Timer mTimer;

@Override
public IBinder onBind(Intent intent) {
    return null;
}

@Override
public void onCreate() {
    super.onCreate();
    LogUtil.w(TAG, "onCreate");
    mContext = this;
    mTimer = new Timer();
    mTimer.scheduleAtFixedRate(new TimerTask() {
        @Override
        public void run() {
            if ((System.currentTimeMillis() - FaisAppConfig.time) > 3 * 60 * 1000) {
                Message msg = new Message();
                msg.what = 0x1234;
                handler.sendMessage(msg);
            }
        }
    }, 0, 2000);
}

private Handler handler = new Handler(new Handler.Callback() {
    @Override
    public boolean handleMessage(Message message) {
        LogUtil.w(TAG, "长时间未操作");
        if (HeartService.isShowing)
            LogUtil.w(TAG, "已经有对话框打开");
        if (message.what == 0x1234 && !HeartService.isShowing) {
            LogUtil.w(TAG, "打开对话框");
            mTimer.cancel();
            exitInput = MessageDialog.getInstence(mContext);
            exitInput.setCanceledOnTouchOutside(false);
            exitInput.setCustomDialog("长时间未操作,请重新登录", "", "确定");
            String packname = mContext.getPackageName();
            PackageManager pm = mContext.getPackageManager();
            boolean permission = (PackageManager.PERMISSION_GRANTED == pm.checkPermission("android.permission.SYSTEM_ALERT_WINDOW", packname));
            if (permission) {
                exitInput.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
            } else {
                exitInput.getWindow().setType(WindowManager.LayoutParams.TYPE_TOAST);
            }
            exitInput.setOnPositiveListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    exitInput.dismiss();
                    stopSelf();
                    Intent intent = new Intent(getBaseContext(), LoginActivity.class);
                    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    startActivity(intent);
                }
            });
            exitInput.show();
        }
        return false;
    }
});

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    return super.onStartCommand(intent, flags, startId);
}

@Override
public void onDestroy() {
    super.onDestroy();
    FaisAppConfig.time = System.currentTimeMillis();
    exitInput = null;
    if (null != mTimer) {
        mTimer.cancel();
        mTimer = null;
    }

    Intent i = new Intent();
    i.setClass(TimeOutService.this, HeartService.class);
    stopService(i);
    LogUtil.w(TAG, "onDestroy");
}
}
复制代码

另外在Service中打开对话框的话需要设置为悬浮窗打开方式,所以必须添加***SYSTEM_ALERT_WINDOW 这项属于特殊权限,6.0以上系统需要特殊处理***

转载于:https://juejin.im/post/5a31dc4ef265da431876c16d

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值