java - 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" />
解决方案
startForegroundService
本身处理版本控制,无需我们自己处理。
启动服务:
Intent service = new Intent(context, BootService.class);
ContextCompat.startForegroundService(this, service)
停止服务:
stopService(new Intent(this, BootService.class));
推荐阅读
- android - 如何在 CollapsingLayout 下的 CoordinatorLayout 中正确对齐元素?
- node.js - NGINX 在 COPY 失败 --from=node /app/dist/comp-lib /usr/share/nginx/html,
- r - R - 在数据框的两列中删除相同的名称
- c# - 在表 B 中创建行时如何更新表 A 中的值?
- javascript - 角度组件中的@Input() 属性返回空数组
- python - Databricks 未在 SQL 查询中更新
- php - 如何使用 PHP 和 Mysqli 将 db 结果显示为 HTML 下拉列表中的选项?
- domain-driven-design - 多个聚合根之间的关系
- python-3.x - 矩形中的点 全部
- reactjs - React 使用 Express 中的路由而不是 index.html