【问题标题】:Android broadcast receiver (screen) not working on Moto gAndroid 广播接收器(屏幕)无法在 Moto g 上运行
【发布时间】:2015-07-17 20:46:36
【问题描述】:

我正在尝试在 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 保持活跃吗?

有什么建议可能是错的吗?或者我应该获得任何其他类型的锁?我不想为锁使用大量电池。

【问题讨论】:

    标签: android broadcastreceiver motorola-droid


    【解决方案1】:

    如果您的服务由于内存不足而被系统杀死,它将稍后重新启动,并将 null 作为意图传递。发生这种情况时,如果 Intent 为空,您将失去广播接收器,因为您什么也不做。

    似乎无法从 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);
    }
    

    【讨论】:

    • 我不是很明白,你能举个例子,我应该怎么做吗?我认为 return sticky 最终会使意图不为空。
    • 删除您对意图的空检查,将您的接收器初始化代码移动到 onCreate(同时删除对 onCreate 的显式调用)并删除您的唤醒锁。
    • 即使你有一个粘性服务系统仍然可以杀死它,它会在它被杀死后重新启动它。当发生这种情况时,您会得到 null 作为意图。此外,当意图不为空时,您永远不会真正开始它,因为您返回任何超级返回而不是粘性。
    • 好的,谢谢,让我试试这个..我会返回结果。
    • 谢谢,它现在可以工作了,只是一个简短的问题,我的应用程序正在三星 g 3 和 nexus 4 上运行,但在 Moto g 上它既不会崩溃,也不会在定期/定义的时间间隔内感知,你能评论在那?我的意思是应用程序从多个传感器感应,但时间延迟不像我使用 ScheduledExecutorService 定义的那样,它太稀疏了。这是因为硬件吗?还是记忆?您的建议会有所帮助。
    猜你喜欢
    • 2012-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多