有关Android屏幕监听的问题
2015-07-01 13:49
483 查看
在Android开发过程中,经常需要监听屏幕的状态,熄屏、亮屏不同的状态,需要 做不同的处理。下面就将项目用到有关屏幕监听的部分介绍一下,水平有限,不好之处望见谅!
public class ScreenListener {
private Context mContext;
private ScreenBroadcastReceiver mScreenReceiver;
private ScreenStateListener mScreenStateListener;
public ScreenListener(Context context) {
mContext = context;
mScreenReceiver = new ScreenBroadcastReceiver();
}
/**
* screen状态广播接收者
*/
private class ScreenBroadcastReceiver extends BroadcastReceiver {
private String action = null;
@Override
public void onReceive(Context context, Intent intent) {
action = intent.getAction();
if (Intent.ACTION_SCREEN_ON.equals(action)) { // 屏幕亮
mScreenStateListener.onScreenOn();
} else if (Intent.ACTION_SCREEN_OFF.equals(action)) { // 屏幕灭
mScreenStateListener.onScreenOff();
} else if (Intent.ACTION_USER_PRESENT.equals(action)) { // 屏幕解锁
mScreenStateListener.onUserPresent();
}
}
}
/**
* 开始监听screen状态
*
*/
public void begin(ScreenStateListener listener) {
mScreenStateListener = listener;
registerListener();
getScreenState();
}
/**
* 获取screen状态
*/
private void getScreenState() {
PowerManager manager = (PowerManager) mContext
.getSystemService(Context.POWER_SERVICE);
if (manager.isScreenOn()) {
if (mScreenStateListener != null) {
mScreenStateListener.onScreenOn();
}
} else {
if (mScreenStateListener != null) {
mScreenStateListener.onScreenOff();
}
}
}
/**
* 注销屏幕监听
*/
public void unregisterListener() {
mContext.unregisterReceiver(mScreenReceiver);
}
/**
* 注册屏幕监听广播,必须要动态注册,因为PowerManager类中做了显示,否则不起作用。
*/
private void registerListener() {
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_SCREEN_ON);
filter.addAction(Intent.ACTION_SCREEN_OFF);
filter.addAction(Intent.ACTION_USER_PRESENT);
mContext.registerReceiver(mScreenReceiver, filter);
}
public interface ScreenStateListener {//显示屏幕状态接口,供调用者自己使用
public void onScreenOn();
public void onScreenOff();
public void onUserPresent();
}
}
以上是屏幕监听的一个类,其中最主要的方法有两个,一个是开始监听的方法,另一个是注销监听的方法。这两个方法分别在初始化监听的时候、应用退出的时候调用。还包括一个动态注册的广播接收者。该广播必须要动态注册才能生效,因为在PowerManager类中做了限制,在配置文件中注册不起作用。一个显示屏幕状态的接口,供调用者自己使用。
在Activity中,screenListener = new ScreenListener(this);新建一个listener对象,然后调用begin方法,开始监听。
screenListener.begin(new ScreenStateListener() {
@Override
public void onUserPresent() {
Log.e("onUserPresent", "onUserPresent");
}
@Override
public void onScreenOn() {//未锁屏,并且surfaceview销毁,mediaPlayer没有销毁
Log.i("Allen", "解锁屏");
if(numScreenOn>0){
isScreen = true;
}
numScreenOn++;
}
@Override
public void onScreenOff() {
Log.i("Allen", "锁屏了");
}
});
注意,在应用退出的时候,一定要注销掉广播接收者,否则容易引发其他不必要的问题。
public class ScreenListener {
private Context mContext;
private ScreenBroadcastReceiver mScreenReceiver;
private ScreenStateListener mScreenStateListener;
public ScreenListener(Context context) {
mContext = context;
mScreenReceiver = new ScreenBroadcastReceiver();
}
/**
* screen状态广播接收者
*/
private class ScreenBroadcastReceiver extends BroadcastReceiver {
private String action = null;
@Override
public void onReceive(Context context, Intent intent) {
action = intent.getAction();
if (Intent.ACTION_SCREEN_ON.equals(action)) { // 屏幕亮
mScreenStateListener.onScreenOn();
} else if (Intent.ACTION_SCREEN_OFF.equals(action)) { // 屏幕灭
mScreenStateListener.onScreenOff();
} else if (Intent.ACTION_USER_PRESENT.equals(action)) { // 屏幕解锁
mScreenStateListener.onUserPresent();
}
}
}
/**
* 开始监听screen状态
*
*/
public void begin(ScreenStateListener listener) {
mScreenStateListener = listener;
registerListener();
getScreenState();
}
/**
* 获取screen状态
*/
private void getScreenState() {
PowerManager manager = (PowerManager) mContext
.getSystemService(Context.POWER_SERVICE);
if (manager.isScreenOn()) {
if (mScreenStateListener != null) {
mScreenStateListener.onScreenOn();
}
} else {
if (mScreenStateListener != null) {
mScreenStateListener.onScreenOff();
}
}
}
/**
* 注销屏幕监听
*/
public void unregisterListener() {
mContext.unregisterReceiver(mScreenReceiver);
}
/**
* 注册屏幕监听广播,必须要动态注册,因为PowerManager类中做了显示,否则不起作用。
*/
private void registerListener() {
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_SCREEN_ON);
filter.addAction(Intent.ACTION_SCREEN_OFF);
filter.addAction(Intent.ACTION_USER_PRESENT);
mContext.registerReceiver(mScreenReceiver, filter);
}
public interface ScreenStateListener {//显示屏幕状态接口,供调用者自己使用
public void onScreenOn();
public void onScreenOff();
public void onUserPresent();
}
}
以上是屏幕监听的一个类,其中最主要的方法有两个,一个是开始监听的方法,另一个是注销监听的方法。这两个方法分别在初始化监听的时候、应用退出的时候调用。还包括一个动态注册的广播接收者。该广播必须要动态注册才能生效,因为在PowerManager类中做了限制,在配置文件中注册不起作用。一个显示屏幕状态的接口,供调用者自己使用。
在Activity中,screenListener = new ScreenListener(this);新建一个listener对象,然后调用begin方法,开始监听。
screenListener.begin(new ScreenStateListener() {
@Override
public void onUserPresent() {
Log.e("onUserPresent", "onUserPresent");
}
@Override
public void onScreenOn() {//未锁屏,并且surfaceview销毁,mediaPlayer没有销毁
Log.i("Allen", "解锁屏");
if(numScreenOn>0){
isScreen = true;
}
numScreenOn++;
}
@Override
public void onScreenOff() {
Log.i("Allen", "锁屏了");
}
});
注意,在应用退出的时候,一定要注销掉广播接收者,否则容易引发其他不必要的问题。
相关文章推荐
- Android四大组件
- android webview中调用了js的时候混淆注意事项
- Android Activity类中的finish()、onDestory()和System.exit(0) 三者的区别
- Android Fragment 你应该知道的一切
- Android 百分比布局库(percent-support-lib) 解析与扩展
- Android xxx is not translated in zh解决办法
- Android 4.1.2系统添加重启功能
- Android开发如何在4.0及以上系统中自定义TitleBar
- Android设计模式之单例模式 Singleton
- Android增量式升级程序
- Android EditText 设置默认键盘类型
- android service服务
- Android Notification的使用
- starting android emulator没反应的解决方案
- Android中调试工具LogCat简析
- android自定义伸缩框(展开效果)
- 一个自己用的代码备份工具,支持delphi,android,java,可以自己添加配置,灵活支持大部分编程语言
- android 模拟器 hosts文件修改 亲测可用
- 错误:指定的任务可执行文件位置 D:\Android\platform-tools\aapt.exe 无效
- AndroidManifest.xml——intent-filter