我正试图在moto g手机上捕捉屏幕开/关事件。主要活动有
Intent intentscreen = new Intent(getApplicationContext(), ScreenService.class);
startService(intentscreen);
其中" 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!");
}
}
清单文件具有权限,但问题是我的手机在最初几个小时内收到该事件,然后它停止接收,即我的日志猫中没有显示Log.d("Screen", "--- I Fire!");
。
另外,如果我获得PowerManager.WakeLock wakeLock
它根本不起作用,但是如果我获得WifiLock wifiLock = null
,这可以工作几个小时,任何建议如何保持Wifi活跃的可能吗?
有什么可能错的建议?或者我应该获得任何其他类型的锁?我不想用很多电池来锁。
答案 0 :(得分:0)
如果您的服务由于内存不足而被系统杀死,则稍后将重新启动,并将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);
}