监听按下电源键锁屏以及解屏

main.xml如下:

<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:textSize="20sp"
        android:text="监视是否按下电源键" />

</RelativeLayout>


MainActivity如下:

package com.cc.screenobservertest;
import com.cc.util.ScreenObserver;
import com.cc.util.ScreenObserver.observerScreenStateUpdateListener;
import android.os.Bundle;
import android.app.Activity;
/**
 * Demo描述:
 * 监听按下电源键锁屏以及再次按下电源键解锁
 */
public class MainActivity extends Activity {
    private ScreenObserver mScreenObserver;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		initScreenObserver();
	}
	private void initScreenObserver(){
		mScreenObserver = new ScreenObserver(MainActivity.this);
		mScreenObserver.observerScreenStateUpdate(new observerScreenStateUpdateListener() {
			@Override
			public void onScreenOn() {
				whenScreenOn();
			}

			@Override
			public void onScreenOff() {
				whenScreenOnOff();
			}
		});
	}
	
	private void whenScreenOn() {
	       System.out.println(" 按下电源键,屏幕现在打开 ");
	}

	private void whenScreenOnOff() {
		  System.out.println(" 按下电源键,屏幕现在关闭 ");
	}
	
	@Override
	protected void onDestroy() {
		super.onDestroy();
		if (mScreenObserver!=null) {
			mScreenObserver.stopScreenStateUpdate();
		}
	}
}


ScreenObserver.java如下:

package com.cc.util;
import java.lang.reflect.Method;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.PowerManager;
public class ScreenObserver {
	private Context mContext;
	private ScreenBroadcastReceiver mScreenBroadcastReceiver;
	private observerScreenStateUpdateListener mObserverScreenStateUpdateListener;
	private static Method mReflectIsScreenOnMethod;

	public ScreenObserver(Context context) {
		mContext = context;
		mScreenBroadcastReceiver = new ScreenBroadcastReceiver();
		try {
			mReflectIsScreenOnMethod = PowerManager.class.getMethod("isScreenOn",new Class[] {});
		} catch (NoSuchMethodException nsme) {
			System.out.println("API<7不可使用使用");
		}
	}

	//接收设备发出的广播
	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)) {
				mObserverScreenStateUpdateListener.onScreenOn();
			} else if (Intent.ACTION_SCREEN_OFF.equals(action)) {
				mObserverScreenStateUpdateListener.onScreenOff();
			}
		}
	}

	//此为入口.
	//监视屏幕状态
	public void observerScreenStateUpdate(observerScreenStateUpdateListener listener) {
		mObserverScreenStateUpdateListener = listener;
		registerScreenBroadcastReceiver();
		//该方法可以根据实际情况取舍
		firstGetScreenState();
	}

	// 注册监听
	private void registerScreenBroadcastReceiver() {
		IntentFilter filter = new IntentFilter();
		filter.addAction(Intent.ACTION_SCREEN_ON);
		filter.addAction(Intent.ACTION_SCREEN_OFF);
		mContext.registerReceiver(mScreenBroadcastReceiver, filter);
	}
	
	//刚运行应用程序时判断屏幕状态
	private void firstGetScreenState() {
		PowerManager manager = (PowerManager) mContext.getSystemService(Activity.POWER_SERVICE);
		if (isScreenOnForFirst(manager)) {
			if (mObserverScreenStateUpdateListener != null) {
				mObserverScreenStateUpdateListener.onScreenOn();
				System.out.println("===> 刚运行程序时,屏幕为打开状态");
			}
		} else {
			if (mObserverScreenStateUpdateListener != null) {
				mObserverScreenStateUpdateListener.onScreenOff();
				System.out.println("===> 刚运行程序时,屏幕为关闭状态");
			}
		}
	}
	
	//刚运行应用程序时判断屏幕是否关闭
	private static boolean isScreenOnForFirst(PowerManager powerManager) {
		boolean screenState;
		try {
			screenState = (Boolean) mReflectIsScreenOnMethod.invoke(powerManager);
			//亦可采用下一句代码判断,从而避免使用反射
			//screenState =powerManager.isScreenOn();
		} catch (Exception e) {
			screenState = false;
		}
		return screenState;
	}


	//停止监视屏幕状态
	public void stopScreenStateUpdate() {
		mContext.unregisterReceiver(mScreenBroadcastReceiver);
	}

	public interface observerScreenStateUpdateListener {
		public void onScreenOn();
		public void onScreenOff();
	}
}


 

 

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

谷哥的小弟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值