Android BOOT_COMPLETED не получен при включении телефона

Существует много ответов, подобных этому ответу https://stackoverflow.com/a/19856367/7742857, но все же я не получил решение, которое я хотел.

Это файл манифеста

 <uses-permission
        android:name="android.permission.PACKAGE_USAGE_STATS"
        tools:ignore="ProtectedPermissions" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

<service android:name=".MyService" />
        <receiver
            android:name=".RestartService"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED"/>
                <category android:name="android.intent.category.DEFAULT"/>

            </intent-filter>
        </receiver>

Это класс службы, я не использую onStartCommand();

     @Override
    public void onTaskRemoved(Intent rootIntent) {
        Intent restartServiceIntent = new Intent(getApplicationContext(), this.getClass());
        restartServiceIntent.setPackage(getPackageName());

        PendingIntent restartServicePendingIntent = PendingIntent.getService(getApplicationContext(), 1, restartServiceIntent, PendingIntent.FLAG_ONE_SHOT);
        AlarmManager alarmService = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE);
        assert alarmService != null;
        alarmService.set(
                AlarmManager.ELAPSED_REALTIME,
                SystemClock.elapsedRealtime() + 1000,
                restartServicePendingIntent);
        super.onTaskRemoved(rootIntent);
        Log.e("Service_Auto_Restart", "ON");
    }

Этот класс находится внутри класса обслуживания

   class TimeDisplayTimerTask extends TimerTask {


        @Override
        public void run() {
            mHandler.post(new Runnable() {
                @Override
                public void run() {
                    Timer();
                    }
            });
        }

    }

и это класс BroadCast

   public class RestartService extends BroadcastReceiver {
    MyService myService;
    MyService.TimeDisplayTimerTask timeDisplayTimerTask;
    @Override
    public void onReceive(Context context, Intent intent) {

        if(intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) {
            context.startService(new Intent(context,MyService.class));
            myService.getPackagesList("package_names");
            myService.getTimer("SELECTED_TIME");
            myService.Timer();
            timeDisplayTimerTask.run();
            Toast.makeText(context,"Restarted",Toast.LENGTH_LONG).show();
        }

    }
}

Я был бы признателен за любую помощь, которую вы можете предоставить.


person ismail    schedule 16.09.2019    source источник


Ответы (2)


Ваш класс BroadcastReceiver не работает. У вас никогда не может быть экземпляра службы. И в вашем собственном коде он никогда не инициализируется, он просто вызовет исключение NullPointerException. Таким образом, вы вполне можете получить один и разбиться.

person Gabe Sechan    schedule 16.09.2019
comment
что я должен сделать сейчас, вы можете мне помочь? я знаю, что мой код неверен, но я не получил никакого другого решения, даже сообщение Toast, которое я не получаю. - person ismail; 16.09.2019
comment
Потому что вы падаете, прежде чем доберетесь до Toast. Удалите все ссылки на myService, они не будут работать. Я даже не могу сказать вам, как это исправить, потому что я не могу сказать, что вы пытаетесь сделать. Но я могу сказать вам, что попытка иметь бесконечно работающую службу через перезапуск, как вы пытаетесь, не будет работать на многих версиях Android. Это противоречит всему, что Google пытается сделать для экономии заряда батареи, и вам нужно найти другой способ сделать что-то. - person Gabe Sechan; 16.09.2019
comment
Теперь я могу получить сообщение Toast после удаления класса обслуживания. Я пытаюсь создать AppLock с таймером вместо пароля, и я хочу продолжать работать с классом обслуживания, который имеет CountDownTimer, поэтому теперь, когда телефон я выключаю и снова включаю, служба останавливается. - person ismail; 16.09.2019
comment
Но я хочу снова перезапустить службу - person ismail; 16.09.2019
comment
@ismail это то, что вы не можете надежно сделать в Android. Намеренно так. Найдите другой способ делать то, что вы на самом деле пытаетесь сделать, не требующий постоянного обслуживания. - person Gabe Sechan; 16.09.2019

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

person Jhonatan Sabadi    schedule 16.09.2019
comment
что ты имеешь ввиду бро? - person ismail; 16.09.2019