Introduction

常常我们开 发程序的时候我们不需要系统唤醒系统锁屏功能,比如我们在做xxxNowTV或XXX播放器这样的程序,用户有时候在看电视或视频的时候不希望系统的锁屏 功能启动,既不想锁频,然而系统却在我们看电视或者视频的时候出来个锁屏的界面进行锁频拉,我们还要想继续看的话还要去解锁,这样好麻烦,不是我们想要 的,那我们该怎么做呢,其实很简单,我这里只讲其中的两种

一 :我们只要在程序中用代码实现。代码如下:

  1. //方法一
  2. getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); setContentView(R.layout.main);
  3. //方法二
  4. @Override
  5. protected void onResume() {
  6. super.onResume();
  7. pManager = ((PowerManager) getSystemService(POWER_SERVICE));
  8. mWakeLock = pManager.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK
  9. | PowerManager.ON_AFTER_RELEASE, TAG);
  10. mWakeLock.acquire();
  11. }
  12. @Override
  13. protected void onPause() {
  14. super.onPause();
  15. if(null != mWakeLock){
  16. mWakeLock.release();
  17. }
  18. }
  19. //方法三
  20. public void unLock(){
  21. mContentResolver = getContentResolver();
  22. //不建议使用
  23. //setLockPatternEnabled(android.provider.Settings.System.LOCK_PATTERN_ENABLED,false);
  24. //推荐使用
  25. setLockPatternEnabled(android.provider.Settings.Secure.LOCK_PATTERN_ENABLED,false);
  26. }
  27. private void setLockPatternEnabled(String systemSettingKey, boolean enabled) {
  28. //不建议使用
  29. //android.provider.Settings.System.putInt(mContentResolver,systemSettingKey, enabled ? 1 : 0);
  30. //推荐使用
  31. android.provider.Settings.Secure.putInt(mContentResolver, systemSettingKey,enabled ? 1 : 0);
  32. }
  33. //但注意要加权限AndroidManifest.xml文件中加入
  34. //<uses-permission android:name="android.permission.WRITE_SETTINGS" />
  35. //还要特别注意的是要加入 android:sharedUserId="android.uid.system",但有一个问题,
  36. //如果加入了sharedUserId后就不能使用eclipse编译了,一定要手动通过 mm -B进行编译,然后把apk install到模拟器或设备中

二:禁用系统的锁频功能,这方法不建议使用,只有在设当的环境下适当使用既可,我们只要知道这样我们也可以达到这样的功能实现就OK。

我们知道Android系统的锁屏时间存放在Setting数据库中,字段为Settings.System.SCREEN_OFF_TIMEOUT。我们可以查看SettingsProvider源码,查看如下文件的源码如下:

~/frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java



查看loadSystemSettings()函数的代码如下
  1. private void loadSystemSettings(SQLiteDatabase db) {
  2. SQLiteStatement stmt = db.compileStatement("INSERT OR IGNORE INTO system(name,value)"
  3. + " VALUES(?,?);");
  4. Resources r = mContext.getResources();
  5. loadBooleanSetting(stmt, Settings.System.DIM_SCREEN,
  6. R.bool.def_dim_screen);
  7. loadSetting(stmt, Settings.System.STAY_ON_WHILE_PLUGGED_IN,
  8. "1".equals(SystemProperties.get("ro.kernel.qemu")) ? 1 : 0);
  9. loadIntegerSetting(stmt, Settings.System.SCREEN_OFF_TIMEOUT,
  10. R.integer.def_screen_off_timeout);
  11. // Set default cdma emergency tone
  12. loadSetting(stmt, Settings.System.EMERGENCY_TONE, 0);
  13. // Set default cdma call auto retry
  14. loadSetting(stmt, Settings.System.CALL_AUTO_RETRY, 0);
  15. // Set default cdma DTMF type
  16. loadSetting(stmt, Settings.System.DTMF_TONE_TYPE_WHEN_DIALING, 0);
  17. // Set default hearing aid
  18. loadSetting(stmt, Settings.System.HEARING_AID, 0);
  19. // Set default tty mode
  20. loadSetting(stmt, Settings.System.TTY_MODE, 0);
  21. loadBooleanSetting(stmt, Settings.System.AIRPLANE_MODE_ON,
  22. R.bool.def_airplane_mode_on);
  23. loadStringSetting(stmt, Settings.System.AIRPLANE_MODE_RADIOS,
  24. R.string.def_airplane_mode_radios);
  25. loadStringSetting(stmt, Settings.System.AIRPLANE_MODE_TOGGLEABLE_RADIOS,
  26. R.string.airplane_mode_toggleable_radios);
  27. loadBooleanSetting(stmt, Settings.System.AUTO_TIME,
  28. R.bool.def_auto_time); // Sync time to NITZ
  29. loadIntegerSetting(stmt, Settings.System.SCREEN_BRIGHTNESS,
  30. R.integer.def_screen_brightness);
  31. loadBooleanSetting(stmt, Settings.System.SCREEN_BRIGHTNESS_MODE,
  32. R.bool.def_screen_brightness_automatic_mode);
  33. loadDefaultAnimationSettings(stmt);
  34. loadBooleanSetting(stmt, Settings.System.ACCELEROMETER_ROTATION,
  35. R.bool.def_accelerometer_rotation);
  36. loadDefaultHapticSettings(stmt);
  37. stmt.close();
  38. }

我们通过查看源码便知道, Settings.System.SCREEN_OFF_TIMEOUT没有初始化的话(系统首次启动,这个字段肯定是没 有初始化的),系统将会利用资源中的R.integer.def_screen_off_timeout来初始化。我们为了让系统永不锁屏,只需要把资源 R.integer.def_screen_off_timeout设为-1即可。查看文件在这里:

frameworks/base/packages/SettingsProvider/res/values/defaults.xml

可以找到R.integer.def_screen_off_timeout的定义

  1. <integer name="def_screen_off_timeout">60000</integer>

发现默认值为60000ms,也就是60s。我们只需要把这个参数改为-1。然后重新编译SettingsProvider模块,就OK了。

但有时候也会有这样的情况发生,用户进入系统后,修改锁屏时间,为了这样的情况发生我们得在Setting模块中删除对锁屏时间的设置。这样Android设备就不锁屏了。

我们这里还要处理一种情况,就是让系统一启动我们就禁用锁屏的功能,很简单,我们只要把系统锁 屏 功能的的初始默认开关给改以下就可以了,如下找到这个类:

frameworks/policies/base/phone/com/android/internal/policy/impl/KeyguardViewMediator.java



该文件中有一个变量定义如下:
  1. /**
  2. * External apps (like the phone app) can tell us to disable the keygaurd.
  3. */
  4. private boolean mExternallyEnabled = true

mExternallyEnabled是用来管理是否开启屏幕锁的关键。默认值是打开屏锁,根据注释可以知道他是希望应用程序来修改这个

值,我们可以把这个值改成false就可以了。
有时候我们不想修改这个初始值,那我们看看这个类有没有提供相应的方法来供外部修改这个值的,不出我们所料,看下面这段代码就是的了:
  1. /**
  2. * Same semantics as {@link WindowManagerPolicy#enableKeyguard}; provide
  3. * a way for external stuff to override normal keyguard behavior.  For instance
  4. * the phone app disables the keyguard when it receives incoming calls.
  5. */
  6. public void setKeyguardEnabled(boolean enabled) {
  7. synchronized (this) {
  8. if (DEBUG) Log.d(TAG, "setKeyguardEnabled(" + enabled + ")");
  9. mExternallyEnabled = enabled;
  10. if (!enabled && mShowing) {
  11. if (mExitSecureCallback != null) {
  12. if (DEBUG) Log.d(TAG, "in process of verifyUnlock request, ignoring");
  13. // we're in the process of handling a request to verify the user
  14. // can get past the keyguard. ignore extraneous requests to disable / reenable
  15. return;
  16. }
  17. // hiding keyguard that is showing, remember to reshow later
  18. if (DEBUG) Log.d(TAG, "remembering to reshow, hiding keyguard, "
  19. + "disabling status bar expansion");
  20. mNeedToReshowWhenReenabled = true;
  21. hideLocked();
  22. } else if (enabled && mNeedToReshowWhenReenabled) {
  23. ...
  24. ...
  25. }
  26. }

我们可以在我们需要修改这个值的地方来调用这个函数去修改,挺简单的吧,OK,锁频就讲到这里,其实锁屏这块还有挺多的知识点.
要想深入的了解其实挺麻烦的,如果大家对锁频有了个比较深入的了解的话,可以尝试自己开发一个琐屏的程序看看。

Android 禁止屏幕休眠和锁屏的方法的更多相关文章

  1. android关闭屏幕时不锁屏实现

    所需权限: <uses-permission android:name="android.permission.DISABLE_KEYGUARD"/> 关闭系统锁屏服务 ...

  2. android 闹钟提醒并且在锁屏下弹出Dialog对话框并播放铃声和震动

    android 闹钟提醒并且在锁屏下弹出Dialog对话框并播放铃声和震动            1.先简单设置一个闹钟提醒事件: //设置闹钟 mSetting.setOnClickListener ...

  3. Android 禁止屏幕旋转 & 旋转屏幕时保持Activity内容

    Android 禁止屏幕旋转 & 旋转屏幕时保持Activity内容   1.在应用中固定屏幕方向.        在AndroidManifest.xml的activity中加入:     ...

  4. CentOS系统里如何正确取消或者延长屏幕保护自动锁屏功能(图文详解)

    不多说,直接上干货! 对于我这里想说的是,分别从CentOS6.X  和  CentOS7.X来谈及. 1. 问题:默认启动屏幕保护 问题描述: CentOS系统在用户闲置一段时间(默认为5分钟)后, ...

  5. Android 4.4 不休眠+不锁屏+默认中文+去除导航栏

    1.不休眠 frameworks/base/packages/SettingsProvider/res/values/defaults.xml 里面60000改成-1,就是不进入休眠. 这个文件还保存 ...

  6. Android判断屏幕锁屏的方法总结

    由于做一个项目,需要判断屏幕是否锁屏,发现网上方法很多,但是比较杂,现在进行总结一下: 总共有两类方法: 一.代码直接判定 二.接收广播 现在先说第一类方法(代码直接判定): 1.通过PowerMan ...

  7. Android推断屏幕锁屏的方法总结

    转载请注明:http://blog.csdn.net/heroxuetao/article/details/24639203 因为做一个项目,须要推断屏幕是否锁屏,发现网上方法非常多.可是比較杂.如今 ...

  8. android中按电源键锁屏然后解锁导致Activity调用onDestory以及如何防止锁屏

    今天在android项目中按电源键锁屏,然后解锁,发现子Activity关闭了,回到了主页,这个问题困扰了我很久,最后打log发现,在按电源键的时候,调用了子Activity的onDestroy()方 ...

  9. Android设备定制为永不锁屏

    Android系统的锁屏时间存放在Setting数据库中,字段为Settings.System.SCREEN_OFF_TIMEOUT.查看 DatabaseHelper.java文件可以找到: fra ...

随机推荐

  1. while循环与i--

    int i = 5;         while(i-- > 0){             System.out.println("i="+i);         } 打印 ...

  2. java代理的深入浅出(三)-JavaAssist,ASM

    简介 类似字节码操作方法还有ASM.几种动态编程方法相比较,在性能上Javassist高于反射,但低于ASM,因为Javassist增加了一层抽象.在实现成本上Javassist和反射都很低,而ASM ...

  3. Java heap space

    //首先检查程序有没有限入死循环 这个问题主要还是由这个问题 java.lang.OutOfMemoryError: Java heap space 引起的.第一次出现这样的的问题以后,引发了其他的问 ...

  4. Android闪光灯操作

    flashMode=Camera.Parameters.FLASH_MODE_TORCH;----常亮效果 Camera.Parameters.FLASH_MODE_ON----一闪一闪的效果

  5. Android状态选择器用法总结

    原创文章,转载请注明出处http://www.cnblogs.com/baipengzhan/p/6284682.html 本文首先列出常见状态选择器的创建,然后按照常用控件来分别列出状态选择器的具体 ...

  6. C语言-字符串文本串联

    要形成包含多个行的字符串,可以串联两个字符串. 为此,请键入正斜杠,然后按 return 键. 反斜杠导致编译器忽略以下换行符. 例如,字符串     "Long strings can b ...

  7. 第十九节,基本数据类型,集合set

    集合set,无序,是不允许重复内容的,也就是不允许重复元素,如果有重复,会自动忽略,可接收可迭代类型 (一般用于需要判断和处理交集时候用到) 集合与字典的区别是,集合没有键只有值,字典是有键的字典是一 ...

  8. HTTP Keep-Alive详解[转]

    HTTP是一个请求<->响应模式的典型范例,即客户端向服务器发送一个请求信息,服务器来响应这个信息.在老的HTTP版本中,每个请求都将被创建一个新的客户端->服务器的连接,在这个连接 ...

  9. spark第二篇--基本原理

    ==是什么 == 目标Scope(解决什么问题) 在大规模的特定数据集上的迭代运算或重复查询检索 官方定义 aMapReduce-like cluster computing framework de ...

  10. HDU2523:SORT AGAIN

    Problem Description 给你N个整数,x1,x2...xn,任取两个整数组合得到|xi-xj|,(0<i,j<=N,i!=j). 现在请你计算第K大的组合数是哪个(一个组合 ...