首页 > 代码库 > BroadcastReceiver之实现锁屏、解锁例子

BroadcastReceiver之实现锁屏、解锁例子

ACTION_SCREEN_ON和ACTION_SCREEN_OFF只能通过动态注册的方式(代码内context.register和unregister),而ACTION_USER_PRESENT则是动态、静态注册两种方式都可以。下面我们通过这个锁屏、解锁相关的BroadcastReceiver来了解一下。

 

[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. package cn.panghu.activitys;  
  2.   
  3. import com.example.broadcastsappdemo.R;  
  4.   
  5. import android.app.Activity;  
  6. import android.app.KeyguardManager;  
  7. import android.app.KeyguardManager.KeyguardLock;  
  8. import android.content.BroadcastReceiver;  
  9. import android.content.Context;  
  10. import android.content.Intent;  
  11. import android.content.IntentFilter;  
  12. import android.os.Bundle;  
  13. import android.os.PowerManager;  
  14. import android.util.Log;  
  15. import android.view.View;  
  16. import android.view.View.OnClickListener;  
  17. import android.view.ViewGroup.LayoutParams;  
  18. import android.widget.Button;  
  19. import android.widget.LinearLayout;  
  20. import android.widget.TextView;  
  21. import android.widget.Toast;  
  22.   
  23. public class ScreenLockedActivity extends Activity{  
  24.     private ScreenBroadcastReceiver screenBroadcastReceiver = null;  
  25.     private Context context = null;  
  26.     private Button lockedScreenBtn = null;  
  27.     @Override  
  28.     protected void onCreate(Bundle savedInstanceState) {  
  29.         super.onCreate(savedInstanceState);  
  30.         context = getApplicationContext();  
  31.         setContentView(R.layout.screen_lock_layout);  
  32.     }  
  33.       
  34.     @Override  
  35.     protected void onResume() {  
  36.         // TODO Auto-generated method stub  
  37.         super.onResume();  
  38.           
  39.         //注册这个广播  
  40.         registerScreenBroadcastReceiver();  
  41.     }  
  42.       
  43.     private void registerScreenBroadcastReceiver() {  
  44.         screenBroadcastReceiver = new ScreenBroadcastReceiver();  
  45.         IntentFilter intentFilter = new IntentFilter();  
  46.         intentFilter.addAction(Intent.ACTION_SCREEN_OFF);//当屏幕锁屏的时候触发  
  47.         intentFilter.addAction(Intent.ACTION_SCREEN_ON);//当屏幕解锁的时候触发  
  48.         intentFilter.addAction(Intent.ACTION_USER_PRESENT);//当用户重新唤醒手持设备时触发  
  49.         context.registerReceiver(screenBroadcastReceiver, intentFilter);  
  50.         Log.i("screenBR", "screenBroadcastReceiver注册了");  
  51.     }  
  52.     //重写广播  
  53.     class ScreenBroadcastReceiver extends BroadcastReceiver{  
  54.   
  55.         @Override  
  56.         public void onReceive(Context context, Intent intent) {  
  57.             String strAction = intent.getAction();  
  58.             if (Intent.ACTION_SCREEN_OFF.equals(strAction)){  
  59.                 //屏幕锁屏  
  60.                 Log.i("screenBR", "屏幕锁屏:ACTION_SCREEN_OFF触发");  
  61.                 Toast.makeText(context, "锁屏了", Toast.LENGTH_SHORT).show();  
  62.             }else if (Intent.ACTION_SCREEN_ON.equals(strAction)){  
  63.                 //屏幕解锁(实际测试效果,不能用这个来判断解锁屏幕事件)  
  64.                 //【因为这个是解锁的时候触发,而解锁的时候广播还未注册】  
  65.                 Log.i("screenBR", "屏幕解锁:ACTION_SCREEN_ON触发");  
  66.                 Toast.makeText(context, "解锁了", Toast.LENGTH_SHORT).show();  
  67.             }else if (Intent.ACTION_USER_PRESENT.equals(strAction)){  
  68.                 //屏幕解锁(该Action可以通过静态注册的方法注册)  
  69.                 //在解锁之后触发的,广播已注册  
  70.                 Log.i("screenBR", "屏幕解锁:ACTION_USER_PRESENT触发");  
  71.                 Toast.makeText(context, "解锁了", Toast.LENGTH_SHORT).show();  
  72.             }else{  
  73.                 //nothing  
  74.             }  
  75.         }  
  76.           
  77.     }  
  78.     @Override  
  79.     protected void onPause() {  
  80.         // TODO Auto-generated method stub  
  81.         super.onPause();  
  82.         context.unregisterReceiver(screenBroadcastReceiver);  
  83.         Log.i("screenBR", "screenBroadcastReceiver取消注册了");  
  84.     }  
  85. }  

 

LogCat结果图:

 

 

由于是静态注册的方式,所以大家可能会觉得那我要怎么让它长久地监听这锁屏、解锁屏幕的广播呢?

首先我们再次强调ACTION_SCREEN_ON和ACTION_SCREEN_OFF只能通过动态注册的方式(代码内context.register和unregister),而ACTION_USER_PRESENT则是动态、静态注册两种方式都可以。

 

那 么我们的突破口便是:我们可以动态地注册一个关于屏幕解锁后(ACTION_USER_PRESENT)的广播者,并且在这个广播的onReceive方 法中实现我们要做的一些操作。例如我们可以开启一个Service服务,用于注册我们所想要的这个Broadcast Receiver

 

 

1.在Service中定义receiver

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. private BroadcastReceiver mScreenFilterReceiver = new BroadcastReceiver() {  
  2.     public void onReceive(Context context, Intent intent) {  
  3.             if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {  
  4.                 //做要求的处理  
  5.             }else if(intent.getAction().equals(Intent.ACTION_SCREEN_OFF)){
  6. }  
  7.     }  
  8. };  

2.在Service的onCreate中定义IntentFilter及注册receiver

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. IntentFilter ScreenFilter = new IntentFilter();  
  2. ScreenFilter.addAction(Intent.ACTION_SCREEN_ON);  
  3. ScreenFilter.addAction(Intent.ACTION_SCREEN_OFF); 
  4. registerReceiver(mScreenFilterReceiver, ScreenFilter);  


3.在Service的onDestroy中要反注册这个receiver。

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. unregisterReceiver(mScreenFilterReceiver); 

BroadcastReceiver之实现锁屏、解锁例子