[转]android detect screen on and screen off

原文出自: http://blog.kenyang.net/2010/11/android-detect-screen-on-and-screen-off.html


android detect screen on and screen off

android偵測螢幕的關閉與開啟,

和偵測sd card一樣,

Intent.ACTION_SCREEN_OFF和Intent.ACTION_SCREEN_ON是不能在AndroidManifest.xml裡面宣告的

如:

?
1
2
3
4
5
6
< receiver android:name = "receiverScreen" >
     < intent-filter
         < action android:name = "android.intent.action.SCREEN_ON" />
         < action android:name = "android.intent.action.SCREEN_OFF" />
     </ intent-filter
</ receiver


這樣子的宣告 沒有用,你永遠都receive不到任何action

詳細原因我也不知道,但是可以透過registerReceiver去實作,

這裡舉個例子,先啟動一個service,由這個service去registerReceiver

由service啟動的好處是,service可以常駐,

如果你用acitivity去registerReceiver

這個acitivity關閉以後,你一樣receive不到任何action

且如果你只是想偵測acitivity的關閉與否的話,可以直接利用onResume和onPause去偵測即可

不用特地去registerReceiver


但是如果今天你有一個widget在桌面,

且我們是無法透過widget去registerReceiver,

會出現exception(ReceiverCallNotAllowedException)

所以一定得透過service去啟動。

service的code如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class serviceScreen extends Service {
 
  @Override
  public IBinder onBind(Intent intent) {
   // TODO Auto-generated method stub
   return null ;
  }
  
  @Override
  public void onStart(Intent intent, int startId) {
      super .onStart(intent, startId);
      try {
           IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
     
           filter.addAction(Intent.ACTION_SCREEN_OFF);
     
           BroadcastReceiver mReceiver = new receiverScreen();
    
           registerReceiver(mReceiver, filter);
      } catch (Exception e) {
           Log.d( "main" ,e.toString());
      }
  }
 
}


receiver的code如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class receiverScreen extends BroadcastReceiver {
 
  @Override
  public void onReceive(Context context, Intent intent) {
   
      if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)){
           //收到螢幕開啟的通知
      } else {
           //收到螢幕關閉的通知
      }
   
  }
 
}



接著就是在widget中去startService

如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public class widgetSmall extends AppWidgetProvider {
  
 
  @SuppressWarnings ( "static-access" )
  @Override
  public void onUpdate(Context context, AppWidgetManager appWidgetManager, int [] appWidgetIds) {
      super .onUpdate(context, appWidgetManager, appWidgetIds);
             
     //啟動一個service
      context.startService( new Intent(context, serviceScreen. class ));
   
   
  }
  
 
  @SuppressWarnings ( "static-access" )
  @Override
  public void onDeleted(Context context, int [] appWidgetIds) {
      super .onDeleted(context, appWidgetIds);
 
 
     //當這個widget被刪除時,就stopService
       context.stopService( new Intent(context, serviceScreen. class ) );
    
       android.os.Process.killProcess(android.os.Process.myPid());
   
  
  }
  
 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值