【问题标题】:Keep JobIntentService running with async task inside保持 JobIntentService 在内部运行异步任务
【发布时间】:2018-06-07 08:15:37
【问题描述】:

我想在我的应用中开发文本转语音 (TTS) 功能。它必须在Service 内部实现,因为用户可能会留下“详细信息”Activity 并返回“主要”Activity 甚至离开我的应用程序,它仍然应该大声说出文本。由于 Oreo 为服务引入了一些后台限制,我必须支持 4.0+ 我必须使用JobIntentService

问题是 TTS 具有异步实现,JobIntentServiceonHandleWork 完成其工作后被杀死,即使我使用 startForeground(在我的代码中为 showSpeakingNotification

有趣的是,当我在 'speakOut' 方法之后在 onHandleWork 中设置断点或只是取消注释 Thread.sleep 时,服务正在工作并读取我的文本(并且存在前台通知)。

问题是如何防止在我的服务实际运行时“自动杀死”我的服务,但在内部使用异步功能?

@Override
protected void onHandleWork(@NonNull Intent intent) {
    if (ACTION_SPEAK.equals(intent.getAction()) && intent.hasExtra(EXTRA_TEXT_ARRAY)) {
        ArrayList<String> textArr = intent.getStringArrayListExtra(EXTRA_TEXT_ARRAY);
        showSpeakingNotification(textArr.get(0));
        if (ttsInitialized)
            speakOut(textArr);
        else if (ttsInitListener != null)
            ttsInitListener.setPendingText(textArr);
    } else if (ACTION_STOP_SPEAKING.equals(intent.getAction())) {
        if (ttsInitialized && tts.isSpeaking())
            tts.stop();
    }
    try {
        //Thread.sleep(10000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

【问题讨论】:

    标签: android android-service text-to-speech jobintentservice


    【解决方案1】:

    只需取消注释 Thread.sleep 服务正在工作并阅读我的文本

    当您添加Thread.sleep(10000); 时,它会阻塞当前线程,因此不会响应您的语音。当您发表评论时,当前线程可以免费阅读您的数据

    问题是如何防止“自动杀死”我的服务 实际运行,但内部使用异步功能?

    注意可能。使用前台服务可以满足您的要求。参考这个SO实现前台服务

    【讨论】:

    • Thread.sleep 它实际上是大声朗读文本(用于睡眠时间),但这只是测试,没有解决方案。希望前台服务能够正常工作,我会检查您的链接并返回反馈或答案标记:) 谢谢!
    • @snachmsm 当然。
    • @snachmsm 太棒了!享受编码
    猜你喜欢
    • 1970-01-01
    • 2010-10-25
    • 2018-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多