我有一个问题是,每次broadcastreceiver创建一个新的OneTimeWorker时是否可以获取当前位置? 工人内部?在我的片段中,我有一个按钮,可以在其中触发广播接收器中的待处理意图。 在我的广播接收器中,我正在制作一个 OneTimeWorker:
class AlarmManagerReceiver : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
val constraints = Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.build()
val workRequest = OneTimeWorkRequestBuilder<WeatherWorker>()
.addTag("OneTimeJobNew") // Add a tag if needed
.setConstraints(constraints)
.build()
WorkManager.getInstance(context!!).enqueue(workRequest)
}
在我的 WeatherWorker 类中
@HiltWorker
class WeatherWorker @AssistedInject constructor(
@Assisted appContext: Context,
@Assisted workerParams: WorkerParameters,
private val repository: WeatherRepository,
private val fusedLocationClient: FusedLocationProviderClient
) : CoroutineWorker(appContext, workerParams) {
override suspend fun doWork(): Result {
return try {
// Check for permission explicitly before accessing location
if (ActivityCompat.checkSelfPermission(
applicationContext,
Manifest.permission.ACCESS_BACKGROUND_LOCATION
) == PackageManager.PERMISSION_GRANTED
) {
var nextDayWeather :Any = Any()
//Permission is granted, proceed to fetch location
val locationResult = fusedLocationClient.lastLocation
val taskResult = Tasks.await(locationResult)
val lat = taskResult.latitude
val long = taskResult.longitude
val result = repository.fetchWeather("$lat,$long")
if (result.status is Success) {
val currentDate = Calendar.getInstance()
// Add 1 day to the current date
currentDate.add(Calendar.DAY_OF_YEAR, 1)
val nextDate = currentDate.time
// Format and print the next date
val dateFormat = SimpleDateFormat("yyyy-MM-dd")
var nextDateStr = dateFormat.format(nextDate)
val forecastDayResult = result.status.data!!.forecast.forecastday
for (dayWeek in forecastDayResult){
if(dayWeek.date.contains(nextDateStr)){
nextDayWeather = dayWeek
break
}
}
if(nextDayWeather is forecastday){
AppUtils.notify(applicationContext,"Tomorrow's Weather","Weather Status: " + "${nextDayWeather.day.condition.text} " +
" Average Temperature: " + "${nextDayWeather.day.avgtemp_c.toInt()}",
R.mipmap.ic_launcher_weather_round)
}
val intent = Intent(applicationContext, AlarmManagerReceiver::class.java)
val pendingIntent = PendingIntent.getBroadcast(
applicationContext,
1,
intent,
PendingIntent.FLAG_IMMUTABLE
)
val alarmManager =
applicationContext.getSystemService(Context.ALARM_SERVICE) as AlarmManager
val calendar = Calendar.getInstance()
calendar.timeInMillis = System.currentTimeMillis()
calendar.add(Calendar.HOUR, 2)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
val canScheduleExactAlarms = alarmManager.canScheduleExactAlarms()
if (!canScheduleExactAlarms) {
// Handle the case where exact alarms cannot be scheduled
// You can fallback to approximate alarms or handle it gracefully
}
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
alarmManager.setExactAndAllowWhileIdle(
AlarmManager.RTC_WAKEUP,
calendar.timeInMillis,
pendingIntent
)
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
alarmManager.setExact(
AlarmManager.RTC_WAKEUP,
calendar.timeInMillis,
pendingIntent
)
} else {
alarmManager.set(
AlarmManager.RTC_WAKEUP,
calendar.timeInMillis,
pendingIntent
)
}
Result.success()
} else {
Result.failure()
}
} else {
// Permission is not granted
AppUtils.notify(applicationContext,"Error","Please select allow all the time from settings.")
Result.failure()
}
}
catch (e: Exception) {
Result.failure()
}
}
}
出于某种原因,两个小时后什么也没发生...... 下一个待定意图似乎根本不会触发 可能是什么错误?
在我的清单中:
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM" />
<!-- or -->
<uses-permission android:name="android.permission.USE_EXACT_ALARM" />
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
找不到针对 android 14 的任何解决方案... 我知道当前位置的后台请求数量有限制,但我每 2 小时发送一次待处理意图。
为什么使用 OneTimeWorker 来设置闹钟?使用PeriodicWorkRequest,工作人员会替换您的警报。您永远不会一起使用这两个概念,您使用 AlarmManager 或 WorkManager,而不是两者都使用