Android 广播接收器(屏幕)在 Moto g 上不工作
Android broadcast receiver (screen) not working on Moto g
我正在尝试在 moto g phone 上捕获屏幕 on/off 事件。主要activity有
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();
}
}
而接收器 class 看起来像:
public class ScreenReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.d("Screen", "--- I Fire!");
}
}
Manifest 文件有权限,但问题是我的 phone 在前几个小时收到事件,然后它停止接收,即 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);
}
我正在尝试在 moto g phone 上捕获屏幕 on/off 事件。主要activity有
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();
}
}
而接收器 class 看起来像:
public class ScreenReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.d("Screen", "--- I Fire!");
}
}
Manifest 文件有权限,但问题是我的 phone 在前几个小时收到事件,然后它停止接收,即 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);
}