Android广播接收器(屏幕)不在Moto g上工作

时间:2015-07-17 20:46:36

标签: android broadcastreceiver motorola-droid

我正试图在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活跃的可能吗?

有什么可能错的建议?或者我应该获得任何其他类型的锁?我不想用很多电池来锁。

1 个答案:

答案 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);
}