Как запустить сервис, даже если телефон не используется? - PullRequest
0 голосов
/ 14 ноября 2018

Я знаю, что этот вопрос задавался несколько раз.И из других ТАКИХ вопросов, это то, что я пытался.Я возвращаю местоположение устройства и состояние телефона каждые 15 минут в SQLITE и отправляю его на сервер на следующий день.Как избежать того, чтобы сервис был убит Android при простое телефона?(Преобразование в системное приложение не подлежит обсуждению.)

@Override
    public void onCreate() {
        Log.e("onCreate", "Service Method");

        mTelephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);

        if (mTimer != null) {// Cancel if already existed
            mTimer.cancel();
            mTimer = null;
        }
        mTimer = new Timer(); //recreate new
        mTimer.scheduleAtFixedRate(new ConnectActivity(), 0, 900000); //Schedule task
    }
@Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        // We want this service to continue running until it is explicitly
        // stopped, so return sticky.
        startServiceForeground(intent, flags, startId);
        return Service.START_STICKY;
    }

    public int startServiceForeground(Intent intent, int flags, int startId) {

        Intent notificationIntent = new Intent(this, DeviceStatusService.class);
        notificationIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);

        Notification notification = new NotificationCompat.Builder(this, "channel_id")
                .setContentTitle("NOTIFICATION NAME")
                .setAutoCancel(true)
                .setDefaults(Notification.DEFAULT_ALL)
                .setWhen(System.currentTimeMillis())
                .setSmallIcon(R.mipmap.default)
                .setPriority(Notification.PRIORITY_MAX)
                .setContentIntent(pendingIntent)
                .setOngoing(true)
                .build();

        startForeground(300, notification);

        return START_STICKY;
    }

    @Override
    public void onTaskRemoved(Intent rootIntent) {
        super.onTaskRemoved(rootIntent);
        Intent intent=new Intent(this,this.getClass());
        startService(intent);
    }

    @Override
    public void onDestroy() {
        Log.e("onDestroy", "Service Method");
        mTimer.cancel(); //For Cancel Timer
        mTimer.purge();
        mTimer = null;
        super.onDestroy();
        Intent broadcastIntent = new Intent("RestartService");
        sendBroadcast(broadcastIntent);
    }

Кроме того, я использовал это manifest.xml:

    <receiver
        android:name=".ServiceRestarterBroadcastReceiver"
        android:enabled="true"
        android:label="RestartServiceWhenStopped">
        <intent-filter>
            <action android:name="RestartService" />
        </intent-filter>
    </receiver>

<service
        android:name=".DeviceStatusService"
        android:enabled="true"
        android:stopWithTask="false"/>

ServiceRestarterBroadcastReceiver.class

public class ServiceRestarterBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(final Context context, Intent intent) {
    /*context.startService(new Intent(context.getApplicationContext(), DeviceStatusService.class));*/
    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                context.startForegroundService(new Intent(context, DeviceStatusService.class));
            } else {
                context.startService(new Intent(context.getApplicationContext(), DeviceStatusService.class));
            }
        }
    }, 60000);

    }
}

Проблема, с которой я сталкиваюсь, заключается в том, что, если экран выключен и устройство переходит в состояние ожидания, каким-то образом служба либо уничтожается, либо не возвращает никакого значения в БД.

PS: Он работал нормально, когда устройство используется.Эта проблема сохраняется, особенно если вы не используете устройство.

1 Ответ

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

Я думаю, вам не следует использовать Сервис для этой цели.Вы должны использовать какие-то расписания задач.Их много - AlertManager, JobSheduler и т. Д. И иногда очень сложно выбрать один.Я рекомендовал начать с этой статьи: https://medium.com/mindorks/android-scheduling-background-services-a-developers-nightmare-c573807c2705

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...