#android #kotlin #broadcastreceiver
Вопрос:
Пока определение получателя в Манифесте работает, я борюсь с динамическим определением. Мое приложение содержит этот код для создания трансляции
val alarmManager = getSystemService(Context.ALARM_SERVICE) as AlarmManager
val intent = Intent(this, AlarmReceiver::class.java)
intent.setAction("com.example.PetesTimerOne.Broadcast")
val pendingIntent = PendingIntent.getBroadcast(this, ALARM_REQUEST_CODE,
intent, PendingIntent.FLAG_UPDATE_CURRENT)
alarmManager.setExact(
AlarmManager.RTC_WAKEUP,
firstAlarm.timeInMillis,
pendingIntent
и для приема у меня есть класс BoardcastReceiver
package com.example.PetesTimerOne
import android.app.NotificationChannel
import android.app.NotificationManager
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.widget.Toast
import android.os.Build
import androidx.core.app.NotificationCompat
import androidx.core.app.NotificationManagerCompat
import androidx.core.content.getSystemService
import android.annotation.TargetApi
class AlarmReceiver: BroadcastReceiver() {
companion object {
const val NOTIFICATION_ID = 100
const val NOTIFICATION_CHANNEL_ID = "1000"
}
override fun onReceive(context: Context, intent: Intent) {
Toast.makeText(context, "onReceive called", Toast.LENGTH_SHORT).show()
//createNotificationChannel(context)
//notifyNotification(context)
// println("onReceive called")
}
Если я определяю получателя в манифесте через
<receiver
android:name=".AlarmReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="com.example.PetesTimerOne.Broadcast"></action>
</intent-filter>
</receiver>
это работает нормально. Однако, когда я вместо этого пытаюсь использовать динамическое определение в моей основной деятельности
private val alarmReceiver = AlarmReceiver()
и в onCreate()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// alarm receiver
val iF = IntentFilter(cBroadcastName)
registerReceiver(alarmReceiver, iF)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
setSupportActionBar(binding.toolbar)
val navController = findNavController(R.id.nav_host_fragment_content_main)
appBarConfiguration = AppBarConfiguration(navController.graph)
setupActionBarWithNavController(navController, appBarConfiguration)
}
это НЕ работает, и я не могу понять, почему. Я проверил множество учебных пособий и не смог определить, чего мне не хватает.
Комментарии:
1. Это будет работать только в том случае, если ваше приложение запущено при срабатывании будильника. Как вы это проверяете?
2. Спасибо, Дэвид, да, приложение работает под управлением ofc. Я запускаю приложение и запускаю будильник, а обратный вызов никогда не вызывается (например , println не выдает выходных данных, тосты не всплывают и т. Д.), В отличие от определения в XML-манифесте, которое работает как шарм.
3. В этом нет никакого смысла. Ваш код выглядит нормально. Пожалуйста, отредактируйте свой вопрос и опубликуйте код от
MainActivity.onCreate()
, а также код отAlarmReceiver
.4. Спасибо, Дэвид, добавил больше кода.
5. как это
cBroadcastName
определяется?