Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/209.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如果我没有';不创建线程?_Android_Multithreading_Service_Wakelock - Fatal编程技术网

Android 如果我没有';不创建线程?

Android 如果我没有';不创建线程?,android,multithreading,service,wakelock,Android,Multithreading,Service,Wakelock,我正在创建一个服务,该服务将被设置为开始使用AlarmManager(使用已用\u REALTIME\u WAKEUP)。我在onStartCommand方法中进行所有处理,主要原因是: 不需要很长时间(从磁盘读取小文件,可能通过NotificationManager推送通知) 如果需要,我可以轻松地将其设置为在单独的过程中启动 在这种情况下,我还需要获得唤醒锁吗 据我所知,只有在创建单独的线程时,才能获得WakeLock(因为操作系统会将主线程视为空闲线程并进入睡眠状态)。这是真的还是我仍然冒

我正在创建一个
服务
,该服务将被设置为开始使用
AlarmManager
(使用
已用\u REALTIME\u WAKEUP
)。我在
onStartCommand
方法中进行所有处理,主要原因是:

  • 不需要很长时间(从磁盘读取小文件,可能通过
    NotificationManager
    推送通知)
  • 如果需要,我可以轻松地将其设置为在单独的过程中启动
  • 在这种情况下,我还需要获得唤醒锁吗

    据我所知,只有在创建单独的线程时,才能获得WakeLock(因为操作系统会将主线程视为空闲线程并进入睡眠状态)。这是真的还是我仍然冒着被操作系统打断的风险。。。打瞌睡?

    注意——目前,您不应该将唤醒警报直接发送给服务。向服务交付与向接收者交付不同;alarm manager无法知道服务何时完成执行,因此即使在调用onStartCommand()之前,它也无法确保为您保留唤醒锁


    因此,要做到这一点,您需要有一个警报发送到的接收器,在该接收器中获取唤醒锁,然后调用startService()让服务执行,并确保在服务完成之前不会释放唤醒锁。是的,对不起,这太糟糕了(我认为Mark或其他人可能对此有帮助代码


    简化这一过程的一种方法是只关心服务已经运行时会发生什么。Context.peek服务()可以在onReceiveIntent()中使用要获取当前正在运行的服务,您可以在接收器中调用它,以便在保持唤醒锁的同时执行关键代码。此外,如果您在同一进程中使用这些服务的常见情况,则可以使用服务文档中显示的相同技巧直接调用它,而无需编写aidl文件。

    “我想Mark或其他人可能对此有帮助程序代码。”--这可能指的是我的
    WakefulIntentService