首页 > 解决方案 > 当应用程序在 android 中被杀死时,alarmmanger 有时会工作或不工作

问题描述

我想在午夜通知。所以我使用了alrammanager。alrammanager 在前台或后台运行良好。但是当我的应用程序被杀死时就会出现问题。alrammanager 有时工作或不工作。我不明白发生这种奇怪的事情......例如,当通知每三分钟发生一次时,应用程序即使在前台或后台也能正常运行。但是当应用程序启动时,即使代码没有变化,通知也会发生或不发生。请帮我...

主要活动

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val picker = findViewById(R.id.timePicker) as TimePicker
        picker.setIs24HourView(true)

        val nextNotifyTime: Calendar = GregorianCalendar()
        val nextDate: Date = nextNotifyTime.getTime()

        val currentTime: Date = nextNotifyTime.getTime()
        val HourFormat = SimpleDateFormat("kk", Locale.getDefault())
        val MinuteFormat = SimpleDateFormat("mm", Locale.getDefault())
        val pre_hour: Int = HourFormat.format(currentTime).toInt()
        val pre_minute: Int = MinuteFormat.format(currentTime).toInt()
        if (Build.VERSION.SDK_INT >= 23) {
            picker.hour = pre_hour
            picker.minute = pre_minute
        } else {
            picker.currentHour = pre_hour
            picker.currentMinute = pre_minute
        }
        val button: Button = findViewById(R.id.button) as Button
        button.setOnClickListener {
            val hour: Int
            val hour_24: Int
            val minute: Int
            if (Build.VERSION.SDK_INT >= 23) {
                hour_24 = picker.hour
                minute = picker.minute
            } else {
                hour_24 = picker.currentHour
                minute = picker.currentMinute
            }
            if (hour_24 > 12) {
                hour = hour_24
            }
            else {
                hour = hour_24- 12
            }

            val calendar: Calendar = Calendar.getInstance().apply {
                set(Calendar.HOUR_OF_DAY, hour)
                set(Calendar.MINUTE, minute)
                set(Calendar.SECOND, 0)
                set(Calendar.MILLISECOND, 0)
            }

            if(calendar.after(Calendar.getInstance())) {
                //calendar.add(Calendar.DATE, 1)
            }

            diaryNotification(calendar)

        }
    }


    fun diaryNotification(calendar: Calendar) {
        val pm = this.packageManager
        val receiver = ComponentName(this, DeviceBootReceiver::class.java)
        val alarmIntent = Intent(this, AlarmReceiver::class.java)
        val pendingIntent = PendingIntent.getBroadcast(this, 0, alarmIntent, 0)
        val alarmManager = getSystemService(Context.ALARM_SERVICE) as AlarmManager

        alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.timeInMillis, 60*1000, pendingIntent)
        pm.setComponentEnabledSetting(receiver,
                PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
                PackageManager.DONT_KILL_APP)
    }

报警接收器

class AlarmReceiver : BroadcastReceiver() {
    override fun onReceive(context: Context, intent: Intent?) {
            val notificationManager =
                context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
            val notificationIntent = Intent(context, MainActivity::class.java)
            notificationIntent.flags = (Intent.FLAG_ACTIVITY_CLEAR_TOP
                    or Intent.FLAG_ACTIVITY_SINGLE_TOP)

            var notification = CustomNotification.getNotificationBuilderInstance(context)

            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                val channelName = "channel name"
                val importance = NotificationManager.IMPORTANCE_LOW
                val channel = NotificationChannel(CHANNEL_ID, channelName, importance)
                notificationManager.createNotificationChannel(channel)
            }


            notificationManager.notify(NOTIFICATION_ID, notification.build())
            
        }
}

设备引导接收器

class DeviceBootReceiver : BroadcastReceiver() {
    override fun onReceive(context: Context, intent: Intent) {
        if (Objects.equals(intent.action, "android.intent.action.BOOT_COMPLETED")) {

            val alarmIntent = Intent(context, AlarmReceiver::class.java)
            val pendingIntent =
                PendingIntent.getBroadcast(context, 0, alarmIntent, 0)
            val manager = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager
            val millis = Calendar.getInstance().timeInMillis
            manager.setRepeating(
                AlarmManager.RTC_WAKEUP, millis,
                60*1000, pendingIntent
            )
        }
    }
}

显现

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="io.haii.alarmdemo">
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:name=".GlobalApplication"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>


        <receiver android:name=".DeviceBootReceiver"
            android:enabled="true">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
        </receiver>

        <receiver android:name=".AlarmReceiver" />

    </application>

</manifest>

标签: androidalarmmanager

解决方案


转到设置->应用程序->您的APK名称->启用自动启动(或类似的东西)

现在即使您的应用程序被杀死,您也会收到通知

另外我建议你看看这个链接:LINK

希望这个“解决方案”可以帮助你,cya ;)


推荐阅读