Передача никогда не выполняется при остановке приложения - PullRequest
1 голос
/ 17 апреля 2019

Я пытаюсь создать сервис, который работает в фоновом режиме, проверяет информацию и выдает уведомления при необходимости. Я попробовал несколько примеров в Интернете, которые в основном совпадают, но я не заставляю их работать.

У меня есть служба и BroadcastReceiver. Когда я запускаю приложение, сервис создается и время регистрируется на каждом тике. Итак, это работает отлично. В onDestroy я настроил новое намерение, которое я отправляю с помощью «sendBroadcast (...)». BroadcastReceiver-класс имеет переопределение onReceive, которое должно регистрировать простой текст. Но я никогда не вижу текст.

Услуга

public class ServiceNoDelay extends Service {
    public int counter = 0;
    Context context;

    public ServiceNoDelay(Context applicationContext) {
        super();
        context = applicationContext;
        Log.i("HERE", "here service created!");
    }

    public ServiceNoDelay() {
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        super.onStartCommand(intent, flags, startId);
        startTimer();
        return START_STICKY;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();

        Log.i("EXIT", "ondestroy!");

        Intent broadcastIntent = new Intent();
        broadcastIntent.setAction("com.custom.package.RestartSensor");
        sendBroadcast(broadcastIntent);
        stoptimertask();


        Log.i("EXIT", "Broadcast send!");
    }

    private Timer timer;
    private TimerTask timerTask;

    public void startTimer() {
        //set a new Timer
        timer = new Timer();

        //initialize the TimerTask's job
        initializeTimerTask();

        //schedule the timer, to wake up every 1 second
        timer.schedule(timerTask, 1000, 1000); //
    }

    public void initializeTimerTask() {
        timerTask = new TimerTask() {
            public void run() {
                Log.i("in timer", "in timer ++++  " + (counter++));
            }
        };
    }

    public void stoptimertask() {
        //stop the timer, if it's not already null
        if (timer != null) {
            timer.cancel();
            timer = null;
        }
    }

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

BroadcastReceiver

public class SensorRestarterBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.i(SensorRestarterBroadcastReceiver.class.getSimpleName(), "Service Stops! Oops!!!!");
        context.startService(new Intent(context, ServiceNoDelay.class));

    }
}

Часть манифеста

<service
            android:name=".ServiceNoDelay"
            android:enabled="true" />
        <receiver
            android:name=".SensorRestarterBroadcastReceiver"
            android:enabled="true"
            android:exported="true"
            android:label="RestartServiceWhenStopped">
            <intent-filter>
                <action android:name="com.custom.package.RestartSensor" />
            </intent-filter>
        </receiver>

Часть кода, которую я вызываю в MainActivity

ServiceNoDelay mSensorService = new ServiceNoDelay(getApplicationContext());
        Intent mServiceIntent = new Intent(getApplicationContext(), mSensorService.getClass());
        startService(mServiceIntent);

Я ожидаю, что logcat покажет "Service Stops! Oops !!!!" когда приложение закрывается, я могу снова активировать службу.

Если я ищу неправильный путь для отображения уведомлений после закрытия приложения; Я открыт для предложений.

1 Ответ

1 голос
/ 17 апреля 2019

Есть несколько вещей, которые вам нужно сделать: 1. Если вам нужно, чтобы служба работала в фоновом режиме, то создайте службу Foreground.2. Отключите режим ожидания 3. или перейдите по этой ссылке, чтобы запустить службу в фоновом режиме

. Или здесь, в своем коде, вы можете позвонить onTaskRemoved и добавить сигнал тревоги, чтобы снова запустить службу

 @Override
public void onTaskRemoved(Intent rootIntent) {
    Log.e("FLAGX : ", ServiceInfo.FLAG_STOP_WITH_TASK + "");

    Intent restartServiceIntent = new Intent(getApplicationContext(),
            this.getClass());
    restartServiceIntent.setPackage(getPackageName());

    Intent intent = new Intent(getApplicationContext(), this.getClass());

    intent.setPackage(getPackageName());

    PendingIntent restartServicePendingIntent = PendingIntent.getService(
            getApplicationContext(), 1, restartServiceIntent,
            PendingIntent.FLAG_ONE_SHOT);
    AlarmManager alarmService = (AlarmManager) getApplicationContext()
            .getSystemService(Context.ALARM_SERVICE);
    alarmService.set(AlarmManager.ELAPSED_REALTIME,
            SystemClock.elapsedRealtime() + 2000,
            restartServicePendingIntent);

    super.onTaskRemoved(rootIntent);
}

Добавить разрешение в манифесте

<uses-permission android:name="android.permission.SET_ALARM"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...