android自定义屏幕,Android自定义屏保
Android亮屏、熄屏的时候会发出广播,通常在熄屏广播中启动屏保
注册屏幕广播
/**
* 注册广播
*
* @param mContext 上下文环境
* @param receiver 将要注册的广播
*/
public void registerScreenSaverReceiver(Context mContext, ScreenReceiver receiver) {
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_SCREEN_OFF);
filter.addAction(Intent.ACTION_SCREEN_ON);
mContext.registerReceiver(receiver, filter);
}
在该广播的Action中有着这样的注释:
/**
* Broadcast Action: Sent when the device wakes up and becomes interactive.
*
* For historical reasons, the name of this broadcast action refers to the power
* state of the screen but it is actually sent in response to changes in the
* overall interactive state of the device.
*
* This broadcast is sent when the device becomes interactive which may have
* nothing to do with the screen turning on. To determine the
* actual state of the screen, use {@link android.view.Display#getState}.
*
* See {@link android.os.PowerManager#isInteractive} for details.
*
* You cannot receive this through components declared in
* manifests, only by explicitly registering for it with
* {@link Context#registerReceiver(BroadcastReceiver, IntentFilter)
* Context.registerReceiver()}.
*
*
This is a protected intent that can only be sent
* by the system.
*/
这就是说,由于历史原因,该广播Action表示屏幕的电信号状态,但是实际上该广播是在屏幕不可进行交互时发出
注:不能通过在Manifest.xml文件注册的方式接收该广播,仅仅支持通过代码registerReceiver(Broadcast ,IntentFilter)的方式进行注册
在 onReceive(Context context, Intent intent) 方法中进行开启自定义屏保:
public class ScreenReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//拿到屏幕锁,亮屏,随即释放,否则屏幕就会保持常量
WakeUtil.getInstance().wakeScreenLock();
WakeUtil.getInstance().releaseScreenLock();
//屏蔽系统的屏保
mKeyguardManager = (KeyguardManager) MyApplication.getInstance().getSystemService(Context.KEYGUARD_SERVICE);
mKeyguardLock = mKeyguardManager.newKeyguardLock("ScreenLockService");
mKeyguardLock.disableKeyguard();
//TODO 开启自定义的屏保;例如:跳转一个Activity,显示屏保图片
}
}
保持屏幕常量
通常,保持屏幕常量有如下方法:
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
官方注释:
/** Window flag: as long as this window is visible to the user, keep the device's screen turned on and bright. */
public static final int FLAG_KEEP_SCREEN_ON = 0x00000080;
即当window对用户可见时,保持屏幕常量。
通过PowerManager.WakeLock
mScreenWakeLock = powerManager.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.SCREEN_DIM_WAKE_LOCK,
this.getClass().getCanonicalName());
if (!mScreenWakeLock.isHeld()) {
mScreenWakeLock.acquire();
}
对于方法newWakeLock(int levelAndFlags, String tag),下面看看该flag和level分别代表什么意义。
PowerManager.ACQUIRE_CAUSES_WAKEUP|PowerManager.SCREEN_DIM_WAKE_LOCK
/**
* 获得唤醒锁时亮屏
*
* 正常情况下,唤醒锁并不能真正唤醒设备,一旦屏幕已经打开,它们就只能继续工作。
* 正如视频软件正常工作一样。
*
*/
public static final int ACQUIRE_CAUSES_WAKEUP = 0x10000000;
/**
* 保证亮屏状态 (可能会变暗);
* 允许关闭背光
* @deprecated Most applications should use
* {@link android.view.WindowManager.LayoutParams#FLAG_KEEP_SCREEN_ON} instead
* of this type of wake lock, as it will be correctly managed by the platform
* as the user moves between applications and doesn't require a special permission.
*/
@Deprecated
public static final int SCREEN_DIM_WAKE_LOCK = 0x00000006;
可以看出该方法已经过时,系统更推荐使用方法1.
3.通过设置系统进入屏保的时间
try {
Settings.System.putInt(mContext.getContentResolver(), Settings.System.SCREEN_OFF_TIMEOUT, paramInt);
} catch (Exception localException) {
localException.printStackTrace();
}
paramInt代表进入屏保或锁屏的时间,单位毫秒ms。这里可设置为Integer.MAX_VALUE。
同样可以通过这种方式进行屏幕亮度(0-255)等的设置:
try {
Settings.System.putInt(mContext.getContentResolver(), Settings.System.SCREEN_BRIGHTNESS, paramInt);
} catch (Exception localException) {
localException.printStackTrace();
}
进入浅休眠(熄屏状态下CPU仍在运行)
mCpuWakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, this.getClass().getCanonicalName());
synchronized (WakeUtil.class) {
if (!mCpuWakeLock.isHeld()) {
mCpuWakeLock.acquire();
}
}
android自定义屏幕,Android自定义屏保相关推荐
- android 手机屏幕横屏竖屏切换
第一篇博客哦~ 本例子是实现简单的屏幕横竖切换的. 主要知识点: getRequestedOrientation() == ActivityInfo.SCREEN_ORIENTATION_PORTRA ...
- Android 实现屏幕的亮屏与锁屏
最近做的电子班牌需要早上7点开启,晚上8点关闭的功能,之前倒是没有接触过这类的东西,所以早上研究了一上午,赶紧记录下来 第一步:先申请权限 <!-- 屏幕唤醒 --> <uses-p ...
- Android 11.0 Settings增加屏保功能(屏保时间必须小于休眠时间)
1.概述 在11.0的定制化产品的需求的需要 要求增加屏保功能,设置屏保前提必须是是需要设置休眠时间大于屏保时间,当屏保时间大于休眠时间时,休眠以后 屏保功能就无效,所以就必须设置好屏保时间 最终效果 ...
- Android 扩展屏幕 实现主屏副屏同步或者异步显示
android的扩展屏幕是通过Presentation 类实现的. Presentation继承自 Dialog. 主屏显示的代码 主屏播放一个video3的视频 .video3在项目的 asset ...
- android平分屏幕,Android GridLayout中元素平分且行充满屏幕(计算器的界面效果)
有时候我们想用GridLayout做类似计算器的效果,可是看起来的效果确实这么的糟糕,如下图: 可是上图的每个元素都没有做到平分屏幕的1/4, 看起来很丑是吧!, 经过修改之后的效果图如下: 原理: ...
- linux6禁用屏幕保护程序,彻底关闭屏幕保护程序的方法避免长时间不动屏幕会生成屏保...
有的朋友听说电脑的屏幕保护程序有具有省电的作用,还可以保护我们的显示器,所以有的朋友就设置了屏幕保护程序. 但是设置完后朋友发现看一部电影,长时间不动屏幕就会生成屏保,要一次有一次晃动鼠标,非常麻烦. ...
- android解锁屏幕大师,锁屏这样玩才高端 应用推荐《锁屏大师》
即便是没事干也要拿起手机按下电源键,解个锁,再按下电源键.应该很多朋友都干过这样的事,足见锁屏界面是一个与大家日常使用手机打交道最多的地方,既然使用频率高自然就有大做文章的地方. 通常从锁屏状态下到打 ...
- 带android小绿人的屏保相册,盘点:那些年我们追过的Android
Android小绿人将在今年十一月份度过第五个生日.而在最新的Android操作系统果冻豆到来之前,还是让我们来回顾一下以前的版本,追忆Android已经走过的岁月. 在正式形成规模效应之前,Andr ...
- Android 保持屏幕不熄屏
1.在AndroidManifest.xml中添加权限 <uses-permission android:name="android.permission.WAKE_LOCK" ...
最新文章
- 隔离见证地址区别_科普:比特币钱包的隔离见证地址与普通地址有何区别?
- GPUImage滤镜之锐化
- 人终究要活出自己对于这个世界的看法和自己的处事方式,并且由内而外的生成自信
- JavaScript实现k-Means算法(附完整源码)
- 颜宁问4对科研夫妻:男科学家怎样平衡事业家庭?
- Apache Camel教程– EIP,路由,组件,测试和其他概念的简介
- mongodb mysql配置_Nosql_MongoDB数据库配置以及基本指令
- git游戏githug
- 一个前端的入行故事,零基础,2个月自学入门前端,半年从外包进淘宝
- Java设计模式之单例模式(七种写法)
- pytorch forward
- C# 调用mschart控件
- 计算机专业的宣传,计算机专业招生宣传口号
- Traceback (most recent call last):
- 用 dfuse Lifecycle 保证你的交易被推送上链
- 高精度地图2019-2020年或可落地
- 鸡的开口药如何选择 什么药防治鸡开口病最快
- 一个大二老学长的迷茫之路
- Invalid value for option“watch“:expected anObject,but got Function.
- django问卷html,Django:动态问卷系统的Model设计
热门文章
- Android与iOS/WP8跨平台整合设计与开发_专栏
- Java爬取网页源代码解析
- GitHub 的替代品(国内版)
- 转移指令的原理01 - 零基础入门学习汇编语言43
- Linux 命令(69)—— objcopy 命令
- windows 运行banana
- 2014.7.7模拟赛【无线通讯网】
- ajax跨域请求 html5,HTML5中使用postMessage实现Ajax跨域请求的方法
- 高中选的美术将来能考计算机学校吗,北京中考美术考上美术高中以后上考大学一定要考美术专业的大学?好考美术高中...
- 大数据架构师工作内容有哪些?