一、效果图

二、实现原理

通过接收系统广播来判断home按键,广播Application全局,在接收到广播的时候在BaseActivity的onStop里面打开输入密码的对话框,再次回到界面就已经是显示密码框了。

    final String SYSTEM_DIALOG_REASON_KEY = "reason";
final String SYSTEM_DIALOG_REASON_RECENT_APPS = "recentapps";   //切换app和长按home
final String SYSTEM_DIALOG_REASON_HOME_KEY = "homekey";  //hone短按回到桌面
final String SYSTEM_DIALOG_REASON_ASSIST = "assist";   //三星部分手机 长按home
final String SYSTEM_DIALOG_REASON_LOCK = "lock";    //锁屏

三、部分源码

BaseApplication.java

package com.tpnet.safenumberdemo;import android.app.Activity;
import android.app.Application;/*** Created by LITP on 2016/8/31.*/
public class BaseApplication extends Application {//监听器private HomeWatcher homeWatcher;@Overridepublic void onCreate() {super.onCreate();//注册按键广播监听initBroadcard();}/*** 初始化广播*/private void initBroadcard(){homeWatcher = new HomeWatcher(this);homeWatcher.startWatch();}/*** BaseActivity的onResume里面设置监听* @param activity 当前所在的activity*/public void setListener(Activity activity){homeWatcher.setOnHomePressedListener((HomeWatcher.OnHomePressedListener) activity);}}

BaseActivity.java

package com.tpnet.safenumberdemo;import android.app.Activity;
import android.os.Bundle;/*** Created by LITP on 2016/8/31.*/
public abstract class BaseActivity extends Activity implements HomeWatcher.OnHomePressedListener {public BaseApplication mApplication;private PassDialog passDialog;private enum Step{HIDE,SHOW}Step step = Step.HIDE;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(setView());mApplication = getBaseApplication();initPassDialog();initListener();initData();}protected abstract void initListener();protected abstract void initData();public abstract int setView();/*** 获取Application* @return*/public BaseApplication getBaseApplication() {if (null == mApplication) {mApplication = (BaseApplication) getApplication();}return mApplication;}/*** 初始化密码框*/protected void initPassDialog(){passDialog = new PassDialog(this);}@Overrideprotected void onResume() {super.onResume();LogUtils.e("onResume");getBaseApplication().setListener(this);}@Overrideprotected void onStop() {super.onStop();LogUtils.e("onStop");if(step == Step.SHOW){passDialog.show();step = Step.HIDE;}}@Overrideprotected void onRestart() {super.onRestart();LogUtils.e("onRestart");}@Overridepublic void onHomeClick() {LogUtils.e("onHomeClick");step = Step.SHOW;}@Overridepublic void onHomeLongClick() {LogUtils.e("onHomeLongClick");step = Step.SHOW;}@Overridepublic void onLockScreen() {LogUtils.e("onLockScreen");step = Step.SHOW;passDialog.show();}}

HomeWatcher.java

package com.tpnet.safenumberdemo;import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;/*** Home 短按长按 锁屏监听封装** @author Litp**/
public class HomeWatcher {static final String TAG = HomeWatcher.class.getClass().getSimpleName();private Context mContext;private IntentFilter mFilter;private OnHomePressedListener mListener;private InnerRecevier mRecevier;// 回调接口public interface OnHomePressedListener {/*** 短按Home按键*/void onHomeClick();/*** 长按Home 或 切换程序*/void onHomeLongClick();/*** 锁屏*/void onLockScreen();}public HomeWatcher(Context context) {mContext = context;mFilter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);mRecevier = new InnerRecevier();}/*** 设置监听** @param listener*/public void setOnHomePressedListener(OnHomePressedListener listener) {mListener = listener;}/*** 开始监听,注册广播*/public void startWatch() {if (mRecevier != null) {mContext.registerReceiver(mRecevier, mFilter);}}/*** 停止监听,注销广播*/public void stopWatch() {if (mRecevier != null) {mContext.unregisterReceiver(mRecevier);}}/*** 广播接收者*/class InnerRecevier extends BroadcastReceiver {final String SYSTEM_DIALOG_REASON_KEY = "reason";final String SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS = "globalactions";final String SYSTEM_DIALOG_REASON_RECENT_APPS = "recentapps";final String SYSTEM_DIALOG_REASON_HOME_KEY = "homekey";final String SYSTEM_DIALOG_REASON_ASSIST = "assist";final String SYSTEM_DIALOG_REASON_LOCK = "lock";@Overridepublic void onReceive(Context context, Intent intent) {String action = intent.getAction();if (action.equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) {   //窗口关闭广播String reason = intent.getStringExtra(SYSTEM_DIALOG_REASON_KEY);if (reason != null) {//LogUtils.e("action:" + action + ",reason:" + reason);if (mListener != null) {if (SYSTEM_DIALOG_REASON_HOME_KEY.equals(reason)) {// 短按home键mListener.onHomeClick();} else if (SYSTEM_DIALOG_REASON_RECENT_APPS.equals(reason)) {// 长按Home键 或者 activity切换键mListener.onHomeLongClick();}else if (SYSTEM_DIALOG_REASON_LOCK.equals(reason)) {// 锁屏mListener.onLockScreen();} else if (SYSTEM_DIALOG_REASON_ASSIST.equals(reason)) {// samsung 长按Home键,测试了三星s4,这个没执行,还是返回了recentappsLogUtils.e("assist");mListener.onHomeLongClick();}}}}}}
}

四、其他方法讨论

还有一种想法,是直接在BaseActivity里面的onStop回调方法里面 判断app是否在前台,不在前台就显示密码框,在前台(如:Activity切换)就不显示。。

本人实验证明: 按Home按键是可以的,但是 切换app就不行了,切换app的时候判断是否在前台是返回真。还有这方法,锁屏也不支持。

还有朋友有好的方法,请留言,谢谢。

demo下载地址:
http://download.csdn.net/detail/niubitianping/9618523

[Android开发] 从后台恢复前台界面需要输入密码的demo|监听Home短按长按锁屏相关推荐

  1. Android监听手机短信

    Android监听手机短信的方法有两种,分别为: 1.接受系统的短信广播:当手机收到新消息时,会发送一条广播,通过该广播就可以获取短信内容: 2.监听短信数据库:利用观察者模式监听短信数据库,当短信数 ...

  2. android ContentObserver监听系统短信和备份短信到本地

    contentProvider中的一个工具,记录一下. 监听短信: package com.example.messagedemo;import android.net.Uri; import and ...

  3. Android Glide图片加载框架(四)回调与监听

    文章目录 Android Glide图片加载框架系列文章 Android Glide图片加载框架(一)基本用法 Android Glide图片加载框架(二)源码解析之with() Android Gl ...

  4. Android进阶之路 - 软键盘中右下角的设置与监听

    在项目中,多多少少会遇到修改软键盘右下角按钮的需求,虽然已经写过几次,但是还是觉得在这里专心做个笔记比较放心 ~ 我的那些软键盘Blog ~ Android进阶之路 - 常见软键盘操作行为 Andro ...

  5. Android开发----音乐播放器(界面设计)

    转眼也沦为"大四狗"的行列当中去,本来打算在暑假的时候找一个实习,结果学校临时安排了"暑期实训" 原本计划好的安排全部被打乱了,哎~~~也只能跟着学校的脚步&q ...

  6. Android——高德地图实现多点连线与点击定位监听实现

    最近开发的项目中需要使用到的功能,如下图所示: 服务器会传来一个包含项数据类型为坐标与时间的数组. 需要实现的功能有: 1.按时间顺序对每个点进行连线. 2.点击单个点会在点的上分dialog内显示时 ...

  7. android蓝牙耳机下的语音(输入/识别)及按键监听

    第一次在csdn写博客,在此把自己折腾了两三天的一个问题的解决过程记录一下. 背景:本人负责公司android平台的app开发,最近要开发一个语音助手类的app,类似于灵犀语音助手.虫洞语音助手等.其 ...

  8. 基于uniapp开发的SUPOIN(销邦) PDA使用广播扫码监听功能

    广播扫码监听功能 扫码方案 摄像头 激光 封装组件 手持 PDA 是 Android 平台,其扫码的解决方案也有摄像头和激光扫描等多种解决方案,这里结合 uni-app 的开发特性,记录一下具体的实现 ...

  9. 微信公众号监听返回按钮关闭当前界面,部分安卓机监听popstate失败【小程序与公众号】

    需求: 微信公众号开发的时候,可能会出现这种需求: 微信公众号内指定某个网页在点击返回键时不回退到上一级,而是直接关闭微信浏览器窗口,用户点击返回按钮本身就是一个返回事件. 解决方案: 利用监听返回事 ...

最新文章

  1. 磁盘配额的wmi版本(C#)
  2. MySql报2006error错误的解决方法(数据过大)
  3. java怎么遍历优先级队列_打印优先级队列的内容[java]
  4. 测试dali协议的软件,基于DALI协议的数字照明控制软件的研发
  5. 前端每周清单第 30 期:WebVR 指南,Vue 代码分割范式,理想的 React 架构特性
  6. serversocket中的backlog是什么_输入网址按回车,到底发生了什么
  7. CentOS7.5.1804 Minimal 静默安装oracle 12c R1企业版
  8. LPC1788内部EEPROM使用的问题
  9. vue结合vue-amap调用高德地图行政区划分并添加标记点
  10. 00007__js自执行函数(function(){})()前加个分号是什么意思
  11. mySQL中的内外连接
  12. 每天学命令get_pins
  13. 经典题目题解:连续子串和
  14. java 匹配开头结尾_正则匹配 符合以什么开头以什么结尾的
  15. 「高频面试题」浏览器从输入url到页面展示中间发生了什么
  16. 什么软件可以测试色卡颜色,Pantone.inc彩通色卡识别软件
  17. linux查看进程信息状态SL,Linux锐速当前连接数等状态查询,service serverSpeeder status 服务,帮助信息...
  18. jQueryHTML5 UI框架Ignite UI 13.2新功能大揭秘(二)
  19. 窥探比特联储(UBTC)的发展前景
  20. 水波加载动画 html+css

热门文章

  1. 如何在Surface Pro平板电脑上重新加载Windows 8.1
  2. ReportViewer本地处理学习总结
  3. 工程机械小型控制器SPC-SFMC-X0402A资料
  4. rpmdb: BDB0113 Thread/process 18616/139854252218432 failed: BDB1507 Thread died in Berkeley DB libra
  5. 什么是封装,如何使用封装
  6. 一篇好的技术方案文档需要注意的细节
  7. c语言程序如何调用标准库函数,如何调用C标准库的exit函数详解
  8. Unity Shader总结(八)——光源类型和光照衰减
  9. 横向加载更多(查看更多)RecyclerView
  10. 命令行执行SQL语句