1. 两种方案

(1) 监听BroadcastReceiver

(2)获取PowerManager事件

### 2.  BroadcastReceiver {#articleHeader1}

#### 2.1. 事件

总共有3个事件:

Intent.ACTION_SCREEN_ON : 屏幕点亮
Intent.ACTION_SCREEN_OFF :屏幕关闭
Intent.ACTION_USER_PRESENT: 用户解锁

#### 2.2. 权限

监听用户解锁需要在AndroidManifest中注册权限

<uses-permission android:name="android.permission.RECEIVE_USER_PRESENT" />

#### 2.3. IntentFilter代码

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);  
        mContext.registerReceiver(mScreenReceiver, filter);  
    }

 

### 3. PowerManager {#articleHeader2}

PowerManager manager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);  
    if (manager.isScreenOn()) {  
        if (mScreenStateListener != null) {  
            mScreenStateListener.onScreenOn();  
        }  
    } else {  
        if (mScreenStateListener != null) {  
            mScreenStateListener.onScreenOff();  
        }  
    }

 

4. Code

import android.annotation.SuppressLint;  
    import android.content.BroadcastReceiver;  
    import android.content.Context;  
    import android.content.Intent;  
    import android.content.IntentFilter;  
    import android.os.PowerManager;  
      
    /**  
     * Created by xiyanglu on 4/11/15.  
     */  
    public class ScreenObserver {  
        private Context mContext;  
        private ScreenBroadcastReceiver mScreenReceiver;  
        private ScreenStateListener mScreenStateListener;  
      
        public ScreenObserver(Context context) {  
            mContext = context;  
            mScreenReceiver = new ScreenBroadcastReceiver();  
        }  
      
        public void startObserver(ScreenStateListener listener) {  
            mScreenStateListener = listener;  
            registerListener();  
            getScreenState();  
        }  
      
        public void shutdownObserver() {  
            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);  
                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();  
                }  
            }  
        }  
      
        public interface ScreenStateListener {// 返回给调用者屏幕状态信息  
            public void onScreenOn();  
      
            public void onScreenOff();  
      
            public void onUserPresent();  
        }  
    }

 

Android监听锁屏键、Home键

项目用到了,记录下,返回键什么的物理按键使用onKeyDown监听就可以了,但是锁屏键、Home键不可以,这里使用广播监听两者状态变化

final String SYSTEM_DIALOG_REASON_KEY = "reason";
final String SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS = "globalactions";
final String SYSTEM_DIALOG_REASON_RECENT_APPS = "recentapps";
final String SYSTEM_DIALOG_REASON_HOME_KEY = "homekey";

IntentFilter片段:

1
        <div class="line number2 index1 alt1">
          2
        </div>
        
        <div class="line number3 index2 alt2">
          3
        </div>
        
        <div class="line number4 index3 alt1">
          4
        </div>
      </td>
      
      <td class="code">
        <div class="container">
          <div class="line number1 index0 alt2">
            `mFilter.addAction(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);``//home键`
          </div>
          
          <div class="line number2 index1 alt1">
            `    ``mFilter.addAction(Intent.ACTION_SCREEN_ON);  ``//开屏`
          </div>
          
          <div class="line number3 index2 alt2">
            `    ``mFilter.addAction(Intent.ACTION_SCREEN_OFF);``//锁屏`
          </div>
          
          <div class="line number4 index3 alt1">
            `    ``mFilter.addAction(Intent.ACTION_USER_PRESENT);``//解锁`
          </div>
        </div>
      </td>
    </tr>
  </table>
</div>

onRecevier片段:

1
        <div class="line number2 index1 alt1">
          2
        </div>
        
        <div class="line number3 index2 alt2">
          3
        </div>
        
        <div class="line number4 index3 alt1">
          4
        </div>
        
        <div class="line number5 index4 alt2">
          5
        </div>
        
        <div class="line number6 index5 alt1">
          6
        </div>
        
        <div class="line number7 index6 alt2">
          7
        </div>
        
        <div class="line number8 index7 alt1">
          8
        </div>
        
        <div class="line number9 index8 alt2">
          9
        </div>
        
        <div class="line number10 index9 alt1">
          10
        </div>
        
        <div class="line number11 index10 alt2">
          11
        </div>
        
        <div class="line number12 index11 alt1">
          12
        </div>
        
        <div class="line number13 index12 alt2">
          13
        </div>
        
        <div class="line number14 index13 alt1">
          14
        </div>
        
        <div class="line number15 index14 alt2">
          15
        </div>
        
        <div class="line number16 index15 alt1">
          16
        </div>
        
        <div class="line number17 index16 alt2">
          17
        </div>
        
        <div class="line number18 index17 alt1">
          18
        </div>
        
        <div class="line number19 index18 alt2">
          19
        </div>
        
        <div class="line number20 index19 alt1">
          20
        </div>
        
        <div class="line number21 index20 alt2">
          21
        </div>
        
        <div class="line number22 index21 alt1">
          22
        </div>
        
        <div class="line number23 index22 alt2">
          23
        </div>
        
        <div class="line number24 index23 alt1">
          24
        </div>
      </td>
      
      <td class="code">
        <div class="container">
          <div class="line number1 index0 alt2">
            `public` `void` `onReceive(Context context, Intent intent) {`
          </div>
          
          <div class="line number2 index1 alt1">
            `           ``String action = intent.getAction();`
          </div>
          
          <div class="line number3 index2 alt2">
            `           ``if` `(action.equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) {`
          </div>
          
          <div class="line number4 index3 alt1">
            `               ``String reason = intent.getStringExtra(SYSTEM_DIALOG_REASON_KEY);`
          </div>
          
          <div class="line number5 index4 alt2">
            `               ``if` `(reason != ``null``) {`
          </div>
          
          <div class="line number6 index5 alt1">
            `                   ``if` `(mListener != ``null``) {`
          </div>
          
          <div class="line number7 index6 alt2">
            `                       ``if` `(reason.equals(SYSTEM_DIALOG_REASON_HOME_KEY)) {`
          </div>
          
          <div class="line number8 index7 alt1">
            `                           ``// 短按home键 `
          </div>
          
          <div class="line number9 index8 alt2">
            `                           ``mListener.onHomePressed();`
          </div>
          
          <div class="line number10 index9 alt1">
            `                       ``} ``else` `if` `(reason`
          </div>
          
          <div class="line number11 index10 alt2">
            `                               ``.equals(SYSTEM_DIALOG_REASON_RECENT_APPS)) {`
          </div>
          
          <div class="line number12 index11 alt1">
            `                           ``// 长按home键 `
          </div>
          
          <div class="line number13 index12 alt2">
            `                           ``mListener.onHomeLongPressed();`
          </div>
          
          <div class="line number14 index13 alt1">
            `                       ``}`
          </div>
          
          <div class="line number15 index14 alt2">
            `                   ``}`
          </div>
          
          <div class="line number16 index15 alt1">
            `               ``}`
          </div>
          
          <div class="line number17 index16 alt2">
            `           ``}`
          </div>
          
          <div class="line number18 index17 alt1">
            `           ``if``(action.equals(Intent.ACTION_SCREEN_ON)){ `
          </div>
          
          <div class="line number19 index18 alt2">
            `               ``mListener.onScreenOn(); `
          </div>
          
          <div class="line number20 index19 alt1">
            `           ``}``else` `if``(action.equals(Intent.ACTION_SCREEN_OFF)){ `
          </div>
          
          <div class="line number21 index20 alt2">
            `               ``mListener.onScreenOff(); `
          </div>
          
          <div class="line number22 index21 alt1">
            `           ``}  ``else``{``// 解锁`
          </div>
          
          <div class="line number23 index22 alt2">
            `               ``//TODO`
          </div>
          
          <div class="line number24 index23 alt1">
            `           ``}`
          </div>
        </div>
      </td>
    </tr>
  </table>
</div>

最后提醒下,对于锁屏操作,由于先走的activity的onPause,onStop,所以不可以像以往反注册广播样在onPause里进行反注册,否则的话会接收不到锁屏操作

💬 评论