Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/206.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 Java服务和定时器/线程睡眠_Android_Service_Timer_Sleep_Intentservice - Fatal编程技术网

Android Java服务和定时器/线程睡眠

Android Java服务和定时器/线程睡眠,android,service,timer,sleep,intentservice,Android,Service,Timer,Sleep,Intentservice,基本上,我需要编写的代码很简单,但作为一名初学者,我仍然对服务、IntentService、创建一个与主活动/UI线程分离的新线程等感到困惑。我将首先解释任务,然后,我认为如何最好地实现这一点 任务 主活动/UI有两个按钮,开始和停止。应用程序应循环执行两个任务,TaskA和TaskB。按下Start时,执行循环。循环包含以下步骤- 在主活动的UI上更新状态:“TaskA在60秒内执行” 等待60秒 更新状态…:“任务A正在执行” 执行任务A 更新状态…:“TaskB在120秒内执行” 等120

基本上,我需要编写的代码很简单,但作为一名初学者,我仍然对服务、IntentService、创建一个与主活动/UI线程分离的新线程等感到困惑。我将首先解释任务,然后,我认为如何最好地实现这一点

任务

主活动/UI有两个按钮,开始和停止。应用程序应循环执行两个任务,TaskA和TaskB。按下Start时,执行循环。循环包含以下步骤-

  • 在主活动的UI上更新状态:“TaskA在60秒内执行”
  • 等待60秒
  • 更新状态…:“任务A正在执行”
  • 执行任务A
  • 更新状态…:“TaskB在120秒内执行”
  • 等120秒
  • 更新状态…:“任务B正在执行”
  • 执行任务B
  • 完成后,循环重复。此循环必须继续,直到用户按下“停止”。如果主活动/用户界面为On Pause、On stop或onDestroy,则此循环不得停止、中断或销毁。主活动/UI应该与循环线程完全分离

    停止按钮:停止循环内所有步骤的执行,无论是哪一步。取消所有计划的任务并停止服务。应用程序现在应处于的状态必须与第一次启动应用程序时的状态相同(与按下Start之前的状态相同)

    问题

    我不确定服务和意向服务的全部功能。我知道服务可以执行多线程,而IntentService执行任务队列并逐个执行

    潜在解决方案

    我上面的周期需要按照正确的顺序执行这8个步骤,因此IntentService将是理想的解决方案

    但我的问题是:我是否可以创建一个完全独立于主活动/UI线程的IntentService,以便它不依赖于主活动的生命周期或线程

    如果没有,实现这一目标的理想替代方案是什么

    谢谢

    我上面的周期需要按照正确的顺序执行这8个步骤,因此IntentService将是理想的解决方案

    不是真的
    IntentService
    专为事务性工作而设计:做几秒钟或几分钟的工作,然后离开。你需要的是能无限期运行的东西

    我是否可以创建一个完全独立于主活动/UI线程的IntentService,以便它不依赖于主活动的生命周期或线程

    IntentService
    通常与进程的主应用程序线程关系不大

    更好的解决方案是定期的
    服务
    。使用标准Java
    ScheduledExecutorService
    处理事件的计时并在后台线程上触发它们的工作。在服务的
    onStartCommand()
    中启动该工作,由活动的
    startService()
    调用触发。在服务的
    ondestory()
    中停止该工作,该工作由活动的
    stopService()
    调用触发。在
    startService()
    stopService()
    之间,您的服务将运行。。。至少有一段时间


    如果您的轮询周期更长,最好使用
    AlarmManager
    ,并让它在该事件点及时控制。这样,您的
    服务就不会一直阻塞内存。目前来看,如果用户不重视您的服务,他们很可能会终止您的应用程序。

    时间从60秒到24小时不等,因此我想我将使用该服务执行AlarmManager并释放内存。我的第二个问题是,当按下Home按钮时,该活动是否仅接收onPause()、onPause()+onStop()或onPause()+onStop()+onDestroy()?因为我想确保活动不会被破坏,如果它被破坏,我将无法停止服务,因为变量中的服务ID将丢失?对吗?@GBA:“所以我想我将使用该服务来执行AlarmManager并释放内存”--更重要的是,您将使用
    AlarmManager
    来执行
    服务。如果您希望这些事件在设备处于睡眠状态时发生,您可能需要my
    WakefulIntentService
    或类似服务:“因为我想确保活动不会被破坏”——您的活动不会永远存在。“我将无法停止服务,因为变量中的服务ID将丢失?”--服务没有ID。在主活动收到暂停或停止后,alarm manager仍将执行服务吗?-也就是说,活动现在处于后台,因为用户按下“开始”并最小化应用程序以继续执行其他任务,或者返回主屏幕以锁定手机。@GBA:“在主活动收到暂停或停止后,alarm manager还会执行服务吗?”-->code>AlarmManager
    将继续处理您请求的事件,直到您告诉它停止(或用户强制关闭)。完美。非常感谢。如果我有更多的问题,我会留下这个帖子。感谢您目前的帮助。:)