Служба Android переднего плана работает медленно, если устройство не используется - PullRequest
0 голосов
/ 14 ноября 2018

У меня есть сервис Android переднего плана, вызванный с уведомлением.В сервисе я просто каждые 10 секунд регистрирую «Tick tack», но приоритетом сервиса является навигация в веб-просмотре каждые X секунд, поэтому я использую новые темы и тоже работаю в основном потоке.

Если яесли приложение подключено к USB, журналы кажутся нормальными, «галочка» вызывается каждые 10 секунд, то же самое, если мобильное устройство разблокировано, и я смотрю журналы в приложении.

Но когда я отключаю USBили я блокирую устройство, вот что происходит:

2018-11-14 12:11:53.115 12596-12596/? I/Service: tick tack
2018-11-14 12:12:18.704 12596-12596/? I/Service: tick tack
2018-11-14 12:15:42.572 12596-12596/? I/Service: tick tack
2018-11-14 12:17:30.942 12596-12596/? I/Service: tick tack
2018-11-14 12:17:53.534 12596-12596/? I/Service: tick tack
2018-11-14 12:18:27.118 12596-12596/? I/Service: tick tack
2018-11-14 12:18:37.118 12596-12596/? I/Service: tick tack
2018-11-14 12:18:47.118 12596-12596/? I/Service: tick tack
2018-11-14 12:18:57.121 12596-12596/? I/Service: tick tack
2018-11-14 12:19:25.208 12596-12596/? I/Service: tick tack
2018-11-14 12:19:48.294 12596-12596/? I/Service: tick tack

Каков предел услуг переднего плана?Можно ли выполнять тяжелую работу на переднем плане, даже если устройство не используется?

1 Ответ

0 голосов
/ 16 ноября 2018

Я сделал эту библиотеку на днях для чего-то похожего в фоновом режиме и на переднем плане

И он работает абсолютно нормально, без проблем.

Причина, по которой я выбрал запуск с AlarmManager, заключается в том, что AlarmManager является отличным кандидатом для планирования, если приложение должно выполнить локальное событие + позволяет приложению планировать задачи, которые могут потребоваться для запуска или повторения после сфера его жизненного цикла. Это позволяет приложению выполнять некоторые функции даже после того, как процесс приложения или все его компоненты Android были очищены системой.

UPDATE

Вызовите этот метод, чтобы запустить службу

 public void call(int Value_in_seconds) {
        if (Value_in_seconds == (int) Value_in_seconds) {
            // Number is integer
            Long time = new GregorianCalendar().getTimeInMillis() + Value_in_seconds * 1000;
            // create an Intent and set the class which will execute when Alarm triggers, here
            // ServiceReciever in the Intent, the onRecieve() method of this class will execute when
            // alarm triggers
            Intent intentAlarm = new Intent(context, ServiceReciever.class);
            // create the object
            AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
            //set the alarm for particular time
            alarmManager.set(AlarmManager.RTC_WAKEUP, time, PendingIntent.getBroadcast(context, 1, intentAlarm, PendingIntent.FLAG_UPDATE_CURRENT));
        } else {
            Toast.makeText(context,  context.getString(R.string.intValue), Toast.LENGTH_SHORT).show();
        }
    }

Создать ServiceReciever Класс

public class ServiceReciever extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        //call the method here

    }
}

внутри вашего manifest

<application>
<receiver android:name="hossamscott.com.github.backgroundservice.ServiceReciever" android:process=":ff" android:exported="true" android:enabled="true">
</receiver>

<service android:name="hossamscott.com.github.backgroundservice.BackgroundTask"/>

</application>

Так и должно быть, если вы хотите запустить его в Thread Чем вы можете добавить следующие строки

public class BackgroundTask extends Service {

    private boolean isRunning;
    private Context context;
    private Thread backgroundThread;


    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        this.context = this;
        this.isRunning = false;
        this.backgroundThread = new Thread(myTask);
    }

    private Runnable myTask = new Runnable() {
        public void run() {
            // Do something here
            new Handler(Looper.getMainLooper()).post(new Runnable() {
                @Override
                public void run() {
                    // do your logic here
                }
            });
            stopSelf();
        }
    };

    @Override
    public void onDestroy() {
        this.isRunning = false;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        if (!this.isRunning) {
            this.isRunning = true;
            this.backgroundThread.start();
        }
        return START_STICKY;
    }

}

И чтобы назвать это class, отредактируйте ServiceReciever так, как это

 @Override
    public void onReceive(Context context, Intent intent) {
        //call the method here
        Intent background = new Intent(context, BackgroundTask.class);
        context.startService(background);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...