Android Widget AlarmManager Повторяется каждые 5 секунд - выпуск обновления Kotlin - PullRequest
0 голосов
/ 17 октября 2019

Я хочу обновить свой виджет в определенное время, а затем я дам новое время после получения старого времени.

пример: вызов обновления в 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>
...