将 JobIntentService 运行 异步任务保留在里面
Keep JobIntentService running with async task inside
我想在我的应用程序中开发文本转语音 (TTS) 功能。它必须在 Service
中实现,因为用户可能会离开 "details" Activity
并返回 "main" Activity
甚至离开我的应用程序,它仍然应该说话大声的文字。由于 Oreo 对服务引入了一些后台限制,我必须支持 4.0+ 我必须使用 JobIntentService
问题是 TTS 有异步实现,JobIntentService
在 onHandleWork
完成它的工作后立即被杀死,即使我使用 startForeground
(在我的代码 showSpeakingNotification
中)
有趣的是,当我在 'speakOut' 方法之后在 onHandleWork
中设置断点时,或者只是取消注释 Thread.sleep
服务正在运行并读取我的文本(并且存在前台通知)。
问题是如何防止 "auto-killing" 我的服务实际上是 运行,但在内部使用异步功能?
@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();
}
}
just uncomment Thread.sleep service is working and reading my text
当您添加 Thread.sleep(10000);
时,它会阻塞当前线程,因此不会响应您的讲话。当您评论它时,当前线程可以自由读取您的数据
Question is how to prevent "auto-killing" my service when it is
actually running, but using asynchronous feature inside?
注意可能。您的要求可以使用前台服务来满足。参考这个SO实现前台服务
我想在我的应用程序中开发文本转语音 (TTS) 功能。它必须在 Service
中实现,因为用户可能会离开 "details" Activity
并返回 "main" Activity
甚至离开我的应用程序,它仍然应该说话大声的文字。由于 Oreo 对服务引入了一些后台限制,我必须支持 4.0+ 我必须使用 JobIntentService
问题是 TTS 有异步实现,JobIntentService
在 onHandleWork
完成它的工作后立即被杀死,即使我使用 startForeground
(在我的代码 showSpeakingNotification
中)
有趣的是,当我在 'speakOut' 方法之后在 onHandleWork
中设置断点时,或者只是取消注释 Thread.sleep
服务正在运行并读取我的文本(并且存在前台通知)。
问题是如何防止 "auto-killing" 我的服务实际上是 运行,但在内部使用异步功能?
@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();
}
}
just uncomment Thread.sleep service is working and reading my text
当您添加 Thread.sleep(10000);
时,它会阻塞当前线程,因此不会响应您的讲话。当您评论它时,当前线程可以自由读取您的数据
Question is how to prevent "auto-killing" my service when it is actually running, but using asynchronous feature inside?
注意可能。您的要求可以使用前台服务来满足。参考这个SO实现前台服务