registerreceiver在Android中实战android detect screen on and screen off
registerreceiver在Android中的实战:android detect screen on and screen off
android侦测屏幕的关闭与开启,
和侦测sd card一样,
Intent.ACTION_SCREEN_OFF和Intent.ACTION_SCREEN_ON是不能在AndroidManifest.xml里面声明的
如:
<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如下:
public class serviceScreen extends Service {@Overridepublic IBinder onBind(Intent intent) {// TODO Auto-generated method stubreturn null;}@Overridepublic 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());}}}
public class receiverScreen extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)){//收到屏幕开启的通知}else{//收到屏幕关闭的通知}}}
如下:
public class widgetSmall extends AppWidgetProvider {@SuppressWarnings("static-access")@Overridepublic void onUpdate(Context context, AppWidgetManager appWidgetManager,int[] appWidgetIds) {super.onUpdate(context, appWidgetManager, appWidgetIds);//启动一个servicecontext.startService(new Intent(context, serviceScreen.class));}@SuppressWarnings("static-access")@Overridepublic void onDeleted(Context context, int[] appWidgetIds) {super.onDeleted(context, appWidgetIds);//当这个widget被刪除时,就stopServicecontext.stopService(new Intent(context, serviceScreen.class) );android.os.Process.killProcess(android.os.Process.myPid());}}
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
