Я хочу обновить свой виджет в определенное время, а затем я дам новое время после получения старого времени.
пример: вызов обновления в 11:30 и следующее время обновления, которое я установлю после 11:30
код работает, но после 11:30 он продолжает вызывать метод onReceive каждые 5 секунд. Обратите внимание, что я не использую повтор и отмену AlarmManager. Обратите внимание, что я использую класс Widget.
, и я удалилandroid: updatePeriodMillis, поэтому нет автоматического обновления
internal fun updateAppWidget(
context: Context,
appWidgetManager: AppWidgetManager,
appWidgetId: Int)
{
val views = RemoteViews(context.packageName, R.layout.new_app_widget)
val pendingIntent: PendingIntent = Intent(context, MainActivity::class.java).let { intent ->
PendingIntent.getActivity(context, 0, intent, 0)
}
views.setOnClickPendingIntent(R.id.cmdClickWidget, pendingIntent)
val alarmManager = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager
val intent = Intent(context, NewAppWidget::class.java)
intent.action = "AUTO_UPDATE"
val pendingIntent2 = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT)
var calendar: Calendar = Calendar.getInstance()
val sdf = SimpleDateFormat("yyyy/MM/dd HH:mm:ss")
var oMnt: Int = Calendar.MINUTE + 1
var oDate = sdf.format(calendar.getTime())
try {
var calendar2: Calendar = Calendar.getInstance()
calendar.set(
calendar.get(Calendar.YEAR),
calendar.get(Calendar.MONTH),
calendar.get(Calendar.DAY_OF_MONTH),
11,
16,
0
)
val datePlusOneMonth: Date = calendar.time
val datePlusOneMonth2: Date = calendar2.time
count++
views.setTextViewText(R.id.txtID, datePlusOneMonth.toString()+" ## "+datePlusOneMonth2.toString())
} catch (e: Exception) {
views.setTextViewText(R.id.txtID,e.message)
}
// For API 19 and later, set may fire the intent a little later to save battery,
// setExact ensures the intent goes off exactly at midnight.
if (Build.VERSION.SDK_INT >= 23) {
alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, calendar.timeInMillis, pendingIntent2)
} else {
alarmManager.setExact(AlarmManager.RTC_WAKEUP, calendar.timeInMillis, pendingIntent2)
}
// Instruct the widget manager to update the widget
appWidgetManager.updateAppWidget(appWidgetId, views)
}
}
override fun onReceive(context: Context?, intent: Intent?) {
super.onReceive(context, intent)
if (intent!!.getAction().equals("AUTO_UPDATE")) {
val manager = AppWidgetManager.getInstance(context)
val ids = manager.getAppWidgetIds(ComponentName(context, NewAppWidget::class.java))
if (intent!!.getAction().equals("AUTO_UPDATE")) {
//playNotification(context!!, true)
}
onUpdate(context!!, manager, ids)
CancellPendingIntent(context)
}
}
fun CancellPendingIntent(_context: Context?) {
var alarmManager = _context!!.getSystemService(Context.ALARM_SERVICE) as AlarmManager
var updateServiceIntent = Intent(_context, NewAppWidget::class.java)
updateServiceIntent.action = "AUTO_UPDATE"
var pendingUpdateIntent = PendingIntent.getService(_context, 0, updateServiceIntent, PendingIntent.FLAG_UPDATE_CURRENT)
// Cancel alarms
try {
alarmManager.cancel(pendingUpdateIntent)
} catch (e: Exception) {
Log.e(ContentValues.TAG, "AlarmManager update was not canceled. " + e.toString())
}
}
xml Файл выглядит следующим образом
<receiver android:name=".NewAppWidget">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<intent-filter>
<action android:name="AUTO_UPDATE" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/new_app_widget_info" />
</receiver>