首页 > 解决方案 > Context.startForegroundService() 没有调用 Service.startForeground() 问题

问题描述

我一直在标题中收到错误,我不知道该怎么办..(这是一个水提醒应用程序。)论坛中有很多荒谬的话题。没有人正确回答。我在设备重新启动时使用它来运行。我检查了很多问题,但没有人能正确回答。

请帮我。提前致谢!

这是我的 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" />

标签: javaandroidservicebroadcastreceiver

解决方案


startForegroundService本身处理版本控制,无需我们自己处理。

启动服务:

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

停止服务:

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

推荐阅读