前言:最近做视频播放,发现当在播放时点击电源键进行锁屏,视频继续播放问题,于是通过广播进行监听。广播监听可以用于很多地方,在此落雨敏详细讲解Home键、锁屏、解屏的事件处理。先讲解思路,然后在一步一步实现,下面会贴出所有代码。
第一:自定义一个类(如:MyBroadcastReceiver);
(1)、将内部类(广播类)作为MyBroadcastReceiver类的成员变量,方便activity使用
(2)、对外接口类(如:ScreenStateListener)作为MyBroadcastReceiver类的成员变量
(3)、接口具有home键、锁屏、解屏的状态方法
(4)、注册广播(如方法:startObserver() ),添加对应的addAction
(5)、注销广播 (如方法:endObserver()) ,调用unregisterReceiver()方法
第二:在内部类(如:ScreenBroadcastReceiver)实现,home键、锁屏、解屏监听
(1)、得到状态,String action = intent.getAction();
(2)、根据状态进行判断如下:
开屏,if(Intent.ACTION_SCREEN_ON.equals(action)){
//这里进行调用开屏处理方法
};
锁屏,if(Intent.ACTION_SCREEN_OFF.equals(action)){
//这里进行调用锁屏处理方法
};
解锁,if(Intent.ACTION_USER_PRESENT.equals(action)){
//这里进行调用解锁处理方法
};
home键,if(action.equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)){
//这里进行调用home键处理方法
};
第三:在Activity中的调用
(1)、声明成员变量
private MyBroadcastReceiver broadcastReceiver;//自定义类
private TextView tv;//记录状态,方便测试
(2)、实列化自定义类中的接口
<TextView
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
第五:广播权限
<uses-permission android:name="android.permission.RECEIVE_USER_PRESENT"/>
完整代码:----------------------------------------------------------------------------------------------
1、自定义类MyBroadcastReceiver
2、Activity类--------------------------------------------------------------------------------------------------
3、xml文件-------------------------------------------------------------------------------------------------------------
4、测试效果图------------------------------------------------------------------------------------
5、源码地址(0分下载,完善代码注释,简单易懂)
http://download.csdn.net/detail/lin857/9741332
第一:自定义一个类(如:MyBroadcastReceiver);
(1)、将内部类(广播类)作为MyBroadcastReceiver类的成员变量,方便activity使用
(2)、对外接口类(如:ScreenStateListener)作为MyBroadcastReceiver类的成员变量
(3)、接口具有home键、锁屏、解屏的状态方法
(4)、注册广播(如方法:startObserver() ),添加对应的addAction
(5)、注销广播 (如方法:endObserver()) ,调用unregisterReceiver()方法
第二:在内部类(如:ScreenBroadcastReceiver)实现,home键、锁屏、解屏监听
(1)、得到状态,String action = intent.getAction();
(2)、根据状态进行判断如下:
开屏,if(Intent.ACTION_SCREEN_ON.equals(action)){
//这里进行调用开屏处理方法
};
锁屏,if(Intent.ACTION_SCREEN_OFF.equals(action)){
//这里进行调用锁屏处理方法
};
解锁,if(Intent.ACTION_USER_PRESENT.equals(action)){
//这里进行调用解锁处理方法
};
home键,if(action.equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)){
//这里进行调用home键处理方法
};
第三:在Activity中的调用
(1)、声明成员变量
private MyBroadcastReceiver broadcastReceiver;//自定义类
private TextView tv;//记录状态,方便测试
(2)、实列化自定义类中的接口
(3)、当前activity销毁时调用广播注销方法
<TextView
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
第五:广播权限
<uses-permission android:name="android.permission.RECEIVE_USER_PRESENT"/>
完整代码:----------------------------------------------------------------------------------------------
1、自定义类MyBroadcastReceiver
package com.example.powertest;
import android.annotation.SuppressLint;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.PowerManager;
import android.util.Log;
public class MyBroadcastReceiver{
private Context mContext;
private ScreenBroadcastReceiver mScreenReceiver;//内部类广播
private ScreenStateListener mScreenStateListener;//对外接口
public MyBroadcastReceiver(Context context) {
mContext = context;
mScreenReceiver = new ScreenBroadcastReceiver();
}
//注册广播与获取状态方法----
public void startObserver(ScreenStateListener listener) {
mScreenStateListener = listener;
registerListener();//注册广播
getScreenState();//获取状态
}
//注销广播方法----
public void endObserver() {
unregisterListener();
}
//获取screen状态
@SuppressLint("NewApi")
private void getScreenState() {
if (mContext == null) {
return;
}
PowerManager manager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
if (manager.isScreenOn()) {
if (mScreenStateListener != null) {
mScreenStateListener.onScreenOn();//屏幕开启
}
}
else {
if (mScreenStateListener != null) {
mScreenStateListener.onScreenOff();//屏幕关闭
}
}
}
//动态广播注册
private void registerListener() {
if (mContext != null) {
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_SCREEN_ON);
filter.addAction(Intent.ACTION_SCREEN_OFF);
filter.addAction(Intent.ACTION_USER_PRESENT);
filter.addAction(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);//home键
mContext.registerReceiver(mScreenReceiver, filter);
}
}
//销毁广播
private void unregisterListener() {
if (mContext != null)
mContext.unregisterReceiver(mScreenReceiver);
}
//---------------------广播-----------------------------
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();
}
// ----------------按home键时调用---------------
else if(action.equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)){
String reason = intent.getStringExtra("reason");
if (reason !=null && mScreenStateListener !=null) {
//短按home键
if (reason.equals("homekey")) {
// 短按home键
mScreenStateListener.onHomePressed();
}
// 长按home键
else if(reason.equals("recentapps")){
//mScreenStateListener.onHomePresseLong();//自己去写长按方法与短按类似
}
}
}
}
}
public interface ScreenStateListener {// 返回给调用者屏幕状态信息
public void onScreenOn();// 开屏
public void onScreenOff();// 锁屏
public void onUserPresent();// 解锁
public void onHomePressed();// 解锁
}
}
2、Activity类--------------------------------------------------------------------------------------------------
package com.example.powertest;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import com.example.powertest.MyBroadcastReceiver.ScreenStateListener;
public class MainActivity extends Activity{
private MyBroadcastReceiver broadcastReceiver;
private TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
}
//初始化广播
private void init() {
tv=(TextView) findViewById(R.id.tv);
tv.setText("开始测试 : ");
broadcastReceiver=new MyBroadcastReceiver(this);
broadcastReceiver.startObserver(new ScreenStateListener() {
// 解锁---------------
@Override
public void onUserPresent() {
String str=tv.getText()+"+";
tv.setText(str+"解锁");
}
// 锁屏---------------------
@Override
public void onScreenOn() {
String str=tv.getText()+"+";
tv.setText(str+"开屏");
}
// 开屏-------------------------
@Override
public void onScreenOff() {
String str=tv.getText()+"+";
tv.setText(str+"锁屏");
}
// home键-------------------------
@Override
public void onHomePressed() {
String str=tv.getText()+"+";
tv.setText(str+"home键");
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
if(broadcastReceiver!=null){
broadcastReceiver.endObserver();
Log.i("test", "注销");
}
}
}
3、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"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.powertest.MainActivity" >
<TextView
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
</RelativeLayout>
4、测试效果图------------------------------------------------------------------------------------
5、源码地址(0分下载,完善代码注释,简单易懂)
http://download.csdn.net/detail/lin857/9741332