BroadcastReceiver之實現鎖屏、解鎖例子,broadcastreceiver

來源:互聯網
上載者:User

BroadcastReceiver之實現鎖屏、解鎖例子,broadcastreceiver

好久沒有寫android的小例子了,由於前幾天寫了一篇關於Intent.Action的文章(http://blog.csdn.net/ljphhj/article/details/38796739),有朋友私信問我關於ACTION_SCREEN_ON和ACTION_SCREEN_OFF還有ACTION_USER_PRESENT三個Action的用法,由於作為一個總結博文,當時並沒有詳細講,ACTION_SCREEN_ON和ACTION_SCREEN_OFF只能通過動態註冊的方式(代碼內context.register和unregister),而ACTION_USER_PRESENT則是動態、靜態註冊兩種方式都可以。下面我們通過這個鎖屏、解鎖相關的BroadcastReceiver來瞭解一下。


package cn.panghu.activitys;import com.example.broadcastsappdemo.R;import android.app.Activity;import android.app.KeyguardManager;import android.app.KeyguardManager.KeyguardLock;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.content.IntentFilter;import android.os.Bundle;import android.os.PowerManager;import android.util.Log;import android.view.View;import android.view.View.OnClickListener;import android.view.ViewGroup.LayoutParams;import android.widget.Button;import android.widget.LinearLayout;import android.widget.TextView;import android.widget.Toast;public class ScreenLockedActivity extends Activity{private ScreenBroadcastReceiver screenBroadcastReceiver = null;private Context context = null;private Button lockedScreenBtn = null;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);context = getApplicationContext();setContentView(R.layout.screen_lock_layout);}@Overrideprotected void onResume() {// TODO Auto-generated method stubsuper.onResume();//註冊這個廣播registerScreenBroadcastReceiver();}private void registerScreenBroadcastReceiver() {screenBroadcastReceiver = new ScreenBroadcastReceiver();IntentFilter intentFilter = new IntentFilter();intentFilter.addAction(Intent.ACTION_SCREEN_OFF);//當螢幕鎖屏的時候觸發intentFilter.addAction(Intent.ACTION_SCREEN_ON);//當螢幕解鎖的時候觸發intentFilter.addAction(Intent.ACTION_USER_PRESENT);//當使用者重新喚醒手持功能時觸發context.registerReceiver(screenBroadcastReceiver, intentFilter);Log.i("screenBR", "screenBroadcastReceiver註冊了");}//重寫廣播class ScreenBroadcastReceiver extends BroadcastReceiver{@Overridepublic void onReceive(Context context, Intent intent) {String strAction = intent.getAction();if (Intent.ACTION_SCREEN_OFF.equals(strAction)){//螢幕鎖屏Log.i("screenBR", "螢幕鎖屏:ACTION_SCREEN_OFF觸發");Toast.makeText(context, "鎖屏了", Toast.LENGTH_SHORT).show();}else if (Intent.ACTION_SCREEN_ON.equals(strAction)){//螢幕解鎖(實際測試效果,不能用這個來判斷解鎖螢幕事件)//【因為這個是解鎖的時候觸發,而解鎖的時候廣播還未註冊】Log.i("screenBR", "螢幕解鎖:ACTION_SCREEN_ON觸發");Toast.makeText(context, "解鎖了", Toast.LENGTH_SHORT).show();}else if (Intent.ACTION_USER_PRESENT.equals(strAction)){//螢幕解鎖(該Action可以通過靜態註冊的方法註冊)//在解鎖之後觸發的,廣播登入Log.i("screenBR", "螢幕解鎖:ACTION_USER_PRESENT觸發");Toast.makeText(context, "解鎖了", Toast.LENGTH_SHORT).show();}else{//nothing}}}@Overrideprotected void onPause() {// TODO Auto-generated method stubsuper.onPause();context.unregisterReceiver(screenBroadcastReceiver);Log.i("screenBR", "screenBroadcastReceiver取消註冊了");}}


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
  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
  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
  1. unregisterReceiver(mScreenFilterReceiver);  


為了在一鍵鎖屏後解鎖也不要按電源鍵,我裝了一個安卓光感鎖屏解鎖,實現放進口袋黑屏,拿出就解鎖但是

越進階的東西越玩不轉!!
 
ios監聽鎖屏解鎖怎實現,需要調用什方法?

首先提出這個需求的不瞭解ios就敢提這樣的功能,實在是佩服

一般應用在切入後台時會給你短暫的處理任務的時間,音樂類、GPS等應用會有特殊的延長時間使不被KILL,但像你的需求在後台做這種事情是不可行的。

你可以監聽應用是否進入後台,但監聽鎖屏和解鎖是系統級的,你無法擷取。
如果現在有能處理你所說的需求的方法,那也是越獄系統能乾的事了,但即使是這種技術你要能實現,你也不僅僅是個做應用的程式員了。
我說的以上內容有時效性,不保證未來IOS系統不會開放。
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.