Привет. Я тестирую LG (K8) под управлением Android 7.0 и много искал решение, но не смог найти.Проблема в том, что когда я выключаю экран, сервис может быть приостановлен (но не уничтожен), так как не происходит ни TTS, ни запись в файл.Когда экран включен или снова включен, проблем нет, TTS и запись в файл происходят, как и ожидалось.Я подозреваю, что режим ожидания не будет преодолен, когда экран выключен, и телефон не сможет разбудить себя, хотя утверждается, что служба переднего плана может преодолеть режим ожидания.Я также проигнорировал оптимизацию батареи для своего приложения (вручную) и также добавил в манифест, зная заранее, что это не окажет большого влияния на Android 6 или 7.
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
<uses-permission android:name="android.permission.WAKE_LOCK"/>
Проблема все еще остается.Есть идеи как это исправить?это специфично для этого телефона?Сервисный код ниже:
public class HelloService extends Service {
private static final String LOG_TAG = "ForegroundService";
TextToSpeech tts;
String strDateFormat = "HH:mm";
SimpleDateFormat dateFormat = new SimpleDateFormat(strDateFormat);
PendingIntent pendingIntent;
public void out(Date dat) throws IOException {
PrintWriter str = new PrintWriter(new FileWriter("/sdcard/out.txt", true));
try {
str.println(dat);
} finally {
if (str != null) {
str.close();
}
}
}
@Override
public void onCreate() {
tts=new TextToSpeech(this, new TextToSpeech.OnInitListener() {
@Override
public void onInit(int status) {
// TODO Auto-generated method stub
if(status == TextToSpeech.SUCCESS){
int result=tts.setLanguage(new Locale("en_GB"));
if(result==TextToSpeech.LANG_MISSING_DATA ||
result==TextToSpeech.LANG_NOT_SUPPORTED){
Log.e("error", "This Language is not supported");
}
}
}
});
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i(LOG_TAG, "Received Start Foreground Intent ");
Intent notificationIntent = new Intent(this, HelloActivity.class);
notificationIntent.setAction(Intent.ACTION_MAIN);
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
| Intent.FLAG_ACTIVITY_CLEAR_TASK);
pendingIntent = PendingIntent.getActivity(this, 0,
notificationIntent, 0);
Notification notification = new NotificationCompat.Builder(this)
.setContentTitle("ServiceTitle")
.setTicker("ServiceTicker")
.setContentText("ServiceText")
.setSmallIcon(R.drawable.ic_launcher)
.setContentIntent(pendingIntent)
.setOngoing(true).build();
startForeground(1337,notification);
Toast.makeText(this, "Started", Toast.LENGTH_SHORT).show();
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
Date date = new Date();
String text = dateFormat.format(date);
if(text==null||"".equals(text))
{
text = "Content not available";
tts.speak(text, TextToSpeech.QUEUE_FLUSH, null);
}
else {
tts.speak(text, TextToSpeech.QUEUE_FLUSH, null);
out(date);
}
// tts and write every 1 minute
Thread.sleep(1 * 60000);
}
catch (Exception e) {
}
}
}
}).start();
return START_STICKY;
}
@Override
public void onDestroy() {
Log.i(LOG_TAG, "In onDestroy");
if (tts != null) {
tts.stop();
tts.shutdown();
Toast.makeText(this, "Stopped", Toast.LENGTH_SHORT).show();
}
super.onDestroy();
}
@Override
public IBinder onBind(Intent intent) {
// Used only in case of bound services.
return null;
}
}