Служба переднего плана Android 7.0 не преодолевает дремлющий режим? - PullRequest
0 голосов
/ 28 декабря 2018

Привет. Я тестирую 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;
    }
}
...