Context.startForegroundService () тогда не вызывал проблему Service.startForeground () - PullRequest
0 голосов
/ 21 апреля 2020

Я продолжаю получать сообщение об ошибке в шапке, и я не знаю, что делать .. (это приложение для напоминания о воде). На форумах много смешных тем. и никто не ответил должным образом. Я использую это для запуска, когда устройство перезагружается. Я изучил много вопросов, но никто не ответил должным образом.

Пожалуйста, помогите мне. Заранее спасибо!

Это мой класс BootReceiver

public class BootReceiver extends BroadcastReceiver {
    @SuppressLint("UnsafeProtectedBroadcastReceiver")
    @Override
    public void onReceive(Context context, Intent intent) {
        Intent service = new Intent(context, BootService.class);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            context.startForegroundService(service);
            Log.d("tag_boot","foreground service start");
        } else {
            context.startService(service);
            Log.d("tag_boot","service start");
        }
    }
}

, а это мой класс BootService

public class BootService extends Service {
    private String MAIN_DATA = "com.xxxx.xxxx.MAIN";
    private SharedPreferences.OnSharedPreferenceChangeListener sharedpreflistener;

    public BootService() {

    }

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

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

        SharedPreferences sharedPreferences = getApplicationContext().getSharedPreferences(MAIN_DATA, Context.MODE_PRIVATE);

        waterreceiver();

    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        return START_NOT_STICKY;
    }


    public void waterreceiver( int su_aralik) {
        Calendar thatDay = Calendar.getInstance();
        Calendar today = Calendar.getInstance();

        int today_month_day = today.get(Calendar.DAY_OF_MONTH);
        int today_month = today.get(Calendar.MONTH);
        int today_year = today.get(Calendar.YEAR);
        thatDay.setTime(new Date(0)); /* reset */

        thatDay.set(Calendar.DAY_OF_MONTH, today_month_day);
        thatDay.set(Calendar.MONTH, today_month); // 0-11 so 1 less
        thatDay.set(Calendar.YEAR, today_year);
        thatDay.set(Calendar.HOUR_OF_DAY, 8);
        thatDay.set(Calendar.MINUTE, 0);
        thatDay.set(Calendar.SECOND, 0);

        Calendar calendar = Calendar.getInstance();

        if (calendar.get(Calendar.HOUR_OF_DAY) < 23 && calendar.get(Calendar.HOUR_OF_DAY) > 7) {
            thatDay.set(Calendar.HOUR_OF_DAY, calendar.get(Calendar.HOUR_OF_DAY) + 1);
        } else {
            thatDay.set(Calendar.DAY_OF_MONTH, today_month_day + 1);
        }

        AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        Intent intent = new Intent(this, WaterAlarm.class);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 7, intent,  PendingIntent.FLAG_UPDATE_CURRENT);
        Objects.requireNonNull(alarmManager).setRepeating(AlarmManager.RTC_WAKEUP, thatDay.getTimeInMillis(), waterlist[water_pos], pendingIntent);
    }

}

Манифест


    <receiver android:name=".AlarmReceiver" />
        <receiver android:name=".WaterAlarm" />
        <receiver android:name=".DietAlarm" />
        <receiver android:name=".BootReceiver">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <action android:name="android.intent.action.QUICKBOOT_POWERON" />
            </intent-filter>
       </receiver>

        <service
            android:name=".BootService"
            android:enabled="true"
            android:exported="true"
            android:permission="android.permission.BIND_JOB_SERVICE" />

1 Ответ

0 голосов
/ 21 апреля 2020

startForegroundService сам обрабатывает управление версиями, не нужно обращаться с самими собой.

Запуск службы:

   Intent service = new Intent(context, BootService.class);
   ContextCompat.startForegroundService(this, service)

Останов службы:

stopService(new Intent(this, BootService.class));
...