Android 監聽鎖屏/開屏事件

jopen 9年前發布 | 59K 次閱讀 Android Android開發 移動開發

1. 兩種方案

(1) 監聽BroadcastReceiver

(2)獲取PowerManager事件


2.  BroadcastReceiver

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

    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();  
    }  
}  </pre><br />

來自:

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!