如何在后台保持应用程序活动

时间:2016-01-19 07:23:48

标签: android

我正在编写一个应用程序,它可以持续监控来自麦克风的输入,处理它(处理算法是用C ++编写的)并保存(记录)或回放一些感兴趣的事件。我在Android L和Android M手机上测试我的应用程序。

根据我的要求,应用程序可以正常使用以下用例:

  1. 启用监控
  2. 按主页按钮以后台发送应用
  3. 确保设备未充电
  4. 等一段时间
  5. 过了一段时间(大约15分钟)我在logcat中收到以下消息:

      

    暂停所有主题......

    为了解决我尝试过的问题:

    1. 按住唤醒锁(PARTIAL_WAKE_LOCK)
    2. 使用asynctask
    3. 使用另一级别的线程生成
    4. 在我的活动中设置FLAG_KEEP_SCREEN_ON
    5. 但它们似乎都不起作用。在iOS上,我可以使用infoplist中的突出显示标记来实现此用例的所需功能。

      enter image description here

      在Android中可以做类似的事吗? (我相信音频播放器已经做了类似的事情)

1 个答案:

答案 0 :(得分:1)

我希望这不是一个完整的解决方案。但我会尝试提供一个可以延长应用程序生命周期的解决方案。首先,不可能始终保持应用程序处于活动状态。这违反了Android的规则,因为当系统需要资源(对于前台应用程序)时,它可能会停止您的应用程序。但是,您可以通过将功能推送到服务中来延长应用程序的生命周期。以下是适合您的解决方案。

  1. 创建一个活动,其中包含2个开始和停止录制的按钮。

  2. 创建服务并将Public静态变量作为标志设置为true或false。

  3. 在活动中使用上述静态字段检查服务是否处于活动状态,并根据它启用或禁用开始录制按钮。

  4. 使用按钮启动服务,在服务内部获取部分唤醒锁并启动线程并进行录制。我希望你不想将你的Intent重新发送给服务,因为它只用于启动一个记录线程。您可以使用START_NOT_STICKY,仅在有待处理的启动呼叫时重新启动服务。如果你真的想重新录制你的意图,并将其附加到新的,我会说它更少,因为你不知道什么时候重启服务,你可能会错过一些录音。

  5. 当您持有部分唤醒锁定时,它将继续运行,直到Foreground应用程序需要资源。由于该服务的优先级高于后台应用程序。

  6. 在onDestroy()中使用中断标志停止线程(通过检查中断标志也保存记录),将公共静态字段设置为FALSE并释放唤醒锁定。完成后,您可以从活动开始录制。

  7. 在您的活动中使用FLAG_KEEP_SCREEN_ON,您只是告诉系统“当我参与此活动时保持屏幕开启”。如果你回家或切换到另一个活动,它将无法正常工作。我希望像视频播放器这样的游戏或应用程序能够使用它来保持屏幕显示。

    我还应该指出,通过长时间保持部分唤醒锁定可能会大大耗尽电池电量。如果您使用FLAG_KEEP_SCREEN_ON,也可以建议您的用户保持活动以进行连续录制。

    我会建议启动意图服务,获取部分唤醒锁并开始录制。因为它将停止创建新线程并在需要时启动或停止它的开销。

    同样在iOS中,我认为当您的应用程序转移到后台时,系统GC将APP作为资源。这就是我在学习iOS时的记忆。

    我希望我的解决方案可以帮助您延长应用程序的使用寿命。谢谢