Android监听Home键、锁屏、解屏(落雨敏详细讲解)附源码

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lin857/article/details/54615602
     前言:最近做视频播放,发现当在播放时点击电源键进行锁屏,视频继续播放问题,于是通过广播进行监听。广播监听可以用于很多地方,在此落雨敏详细讲解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)、实列化自定义类中的接口

                   (3)、当前activity销毁时调用广播注销方法


      第四:xml代码,记录状态,方便测试
                 
  
      <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






 

猜你喜欢

转载自blog.csdn.net/lin857/article/details/54615602