我试图在moto g手机上捕获屏幕开/关事件。主要活动有
Intent intentscreen = new Intent(getApplicationContext(), ScreenService.class);
startService(intentscreen);
where as "ScreenService"看起来像:
public int onStartCommand(Intent intent, int flags, int startId)
{
if (intent!=null)
{
super.onCreate();
WifiManager wm = (WifiManager) getSystemService(Context.WIFI_SERVICE);
wifiLock = wm.createWifiLock(WifiManager.WIFI_MODE_FULL , "MyWifiLock");
if(!wifiLock.isHeld()){
wifiLock.acquire();
}
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_SCREEN_ON);
filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY);
registerReceiver(this.mybroadcast, filter);
return super.onStartCommand(intent, flags, startId);
}
return START_STICKY;
}
@Override
public void onDestroy()
{
super.onDestroy();
unregisterReceiver(mybroadcast);
if(wifiLock.isHeld()){
wifiLock.release();
}
}
而接收类看起来像:
public class ScreenReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.d("Screen", "--- I Fire!");
}
}
Manifest文件有权限,但问题是我的手机在前几个小时收到事件,然后它停止接收,即Log.d("Screen", "--- I Fire!");
未显示在我的日志中。
还要进一步补充,如果我获得PowerManager.WakeLock wakeLock
,它根本不起作用,但如果我获得WifiLock wifiLock = null
,这可以工作几个小时,任何建议如何保持Wifi活跃?
有什么问题吗?或者我应该获得任何其他类型的锁?
如果你的服务由于内存不足而被系统杀死,它将在稍后以null作为意图被重新启动。当这种情况发生时,如果intent为null,您将失去广播接收器,因为您什么都不做。
似乎不可能从android清单中的静态接收器获得这些广播。所以你可能不得不保留你的服务。
下面的内容:
public void onCreate (){
super.onCreate();
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_SCREEN_ON);
filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY);
registerReceiver(mybroadcast, filter);
}
public int onStartCommand(Intent intent, int flags, int startId)
{
return START_STICKY;
}
@Override
public void onDestroy()
{
super.onDestroy();
unregisterReceiver(mybroadcast);
}