Я пытаюсь сделать сигнал, который отправляет уведомление, когда приложение закрыто. Я создал Alarm Manager в MainActivity и создал внутренний класс для BroadcastReceiver, как только срабатывает onReceive()
, мне нужно отправить уведомление. Будильник работает, но каждый раз, когда он пытается отправить уведомление, я получаю сообщение об ошибке
2020-03-25 13: 19: 33.166 15045-15045 / com. kotlin .ambulantlcs E / AndroidRuntime: FATAL EXCEPTION: main Процесс: com. kotlin .ambulantlcs, PID: 15045 java .lang.RuntimeException: Невозможно запустить получатель com. kotlin .ambulantlcs.ui.MainActivity $ Получатель: kotlin .UninitializedPropertyAccessException : свойство lateinit messagesManager не было инициализировано в android .app.ActivityThread.handleReceiver (ActivityThread. java: 3997) в android .app.ActivityThread.access $ 1500 (ActivityThread. java: 267) в android .app.ActivityThread $ H.handleMessage (ActivityThread. java: 1992) в android .os.Handler.dispatchMessage (Обработчик. java: 107) в android .os.Looper.l oop (Looper. java: 237) на android .app.ActivityThread.main (ActivityThread. java: 7777) на java .lang.reflect.Method.invoke (собственный метод) на com. android .internal.os.RuntimeInit $ MethodAndArgsCaller.run (RuntimeInit. java: 493) в com. android .internal.os .ZygoteInit.main (ZygoteInit. java: 1047) Вызывается: kotlin .UninitializedPropertyAccessException: свойство свойства lateinit не было инициализировано в com. kotlin .ambulantlcs.ui.MainActivity $ Receiver.onReceive (MainActivity.kt: 100) по android .app.ActivityThread.handleReceiver (ActivityThread. java: 3988) по android .app.ActivityThread.access $ 1500 (ActivityThread. java: 267) по android .app.ActivityThread $ H.handleMessage (ActivityThread. java: 1992) в android .os.Handler.dispatchMessage (Handler. java: 107) в android .os.Looper.l oop (Looper. java : 237) в android .app.ActivityThread.main (ActivityThread. java: 7777) в java .lang.reflect.Method.invoke (собственный метод) в com. android .internal.os.RuntimeInit $ MethodAndArgsCaller.run (RuntimeInit. java: 493) в com. android .internal.os.ZygoteInit.main (ZygoteInit. java: 1047)
Пожалуйста, смотрите весь мой код ниже.
import android.app.*
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.graphics.Color
import android.os.Build
import android.os.Bundle
import android.util.Log
import android.widget.RemoteViews
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.navigation.NavOptions
import androidx.navigation.Navigation
import androidx.navigation.ui.AppBarConfiguration
import androidx.navigation.ui.NavigationUI
import com.kotlin.ambulantlcs.R
import com.kotlin.ambulantlcs.storage.SharedDataManager
import com.kotlin.ambulantlcs.ui.fragments.LoginFragmentDirections
import java.util.*
open class MainActivity : AppCompatActivity() {
lateinit var context: Context
lateinit var alarmManager: AlarmManager
val obj: MainActivity = this
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val appBarConfiguration = AppBarConfiguration
.Builder(R.id.homeFragment, R.id.loginFragment)
.build()
setAlarm()
if(SharedDataManager.getInstance(this).isLoggedIn) {
var navOptions = NavOptions.Builder()
.setPopUpTo(R.id.action_login_Home, true)
.build()
val navController = Navigation.findNavController(this, R.id.fragment)
NavigationUI.setupActionBarWithNavController(this, navController, appBarConfiguration)
navController.navigate(
LoginFragmentDirections.actionLoginHome()
)
} else {
val navController = Navigation.findNavController(this, R.id.fragment )
NavigationUI.setupActionBarWithNavController(this, navController, appBarConfiguration)
}
}
override fun onBackPressed() {
Toast.makeText(applicationContext, "Function is not allowed", Toast.LENGTH_SHORT).show()
}
override fun onSupportNavigateUp(): Boolean {
return NavigationUI.navigateUp(Navigation.findNavController(this, R.id.fragment), null)
}
fun setAlarm() {
Log.d("MainActivity", "Create: ${Date().toString()}")
context = this
alarmManager = getSystemService(Context.ALARM_SERVICE) as AlarmManager
val seconds = 10 * 1000
val intent = Intent(context, Receiver::class.java)
val pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT)
Log.d("MainActivity", "SECONDS: ${seconds.toLong()}")
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, seconds.toLong(), seconds.toLong(), pendingIntent)
}
class Receiver : BroadcastReceiver() {
lateinit var notificationManager : NotificationManager
lateinit var notificationChannel : NotificationChannel
lateinit var builder : Notification.Builder
private val channelId = "i.apps.notifications"
private val description = "Test notification"
override fun onReceive(context: Context?, intent: Intent?) {
Log.d("MainActivity", " Receiver: ${Date().toString()}")
val intent = Intent(context, MainActivity::class.java)
val pIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT)
val contentView = RemoteViews("com.kotlin.ambulantlcs",
R.layout.activity_main)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
notificationChannel = NotificationChannel(
channelId,description,NotificationManager.IMPORTANCE_HIGH)
notificationChannel.enableLights(true)
notificationChannel.lightColor = Color.GREEN
notificationChannel.enableVibration(false)
notificationManager.createNotificationChannel(notificationChannel)
builder = Notification.Builder(context, channelId)
.setContent(contentView)
.setSmallIcon(R.drawable.ic_launcher_background)
.setContentIntent(pIntent)
}else{
builder = Notification.Builder(context)
.setContent(contentView)
.setSmallIcon(R.drawable.ic_launcher_background)
.setContentIntent(pIntent)
}
notificationManager.notify(1234,builder.build())
}
}
}
Можете ли вы помочь мне исправить это? Спасибо.