【问题标题】:AlarmManager and BroadcastReceiver where intent has no extra at allAlarmManager 和 BroadcastReceiver 的意图根本没有额外的
【发布时间】:2021-03-10 10:44:46
【问题描述】:

我尝试在准确的时间发送通知,因此我添加了一个 AlarmManager。 AlarmReceiver 被触发, 意图动作已设置,但没有任何额外内容。

我为 AlarmManager 做了一个简单的分离 AlarmService 类 报警服务.kt:

private const val TAG = "AlarmService"

class AlarmService @Inject constructor(
    @ApplicationContext private val context: Context
) {

    private val alarmManager: AlarmManager? =  context.getSystemService(Context.ALARM_SERVICE) as AlarmManager
    private fun getPendingIntent(intent: Intent): PendingIntent =
        PendingIntent.getBroadcast(
            context,
            0,//RandomUtil.getRandomInt(),
            intent,
            PendingIntent.FLAG_UPDATE_CURRENT
        )


    fun reminderAlarm(timeInMillis: Long, item: CustomParcelable){
        val intent = Intent(context, AlarmReceiver::class.java)
        intent.apply {
            action = Constants.ACTION_SET_EXACT_ALARM_REMINDER
            putExtra(Constants.EXTRA_EXACT_ALARM_TIME, timeInMillis)
            putExtra(Constants.EXTRA_EXACT_ALARM_ITEM, CustomParcelable)
        }
        setAlarm(timeInMillis, getPendingIntent(intent))
    }


    private fun setAlarm(timeInMillis: Long, pendingIntent: PendingIntent){
        alarmManager?.let {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
                alarmManager.setExactAndAllowWhileIdle(
                    AlarmManager.RTC_WAKEUP,
                    timeInMillis,
                    pendingIntent
                )
            } else {
                alarmManager.setExact(
                    AlarmManager.RTC_WAKEUP,
                    timeInMillis,
                    pendingIntent
                )
            }
        }
    }

Eveything 工作正常,但是当触发 AlarmReceiver 时,只有意图 ACTION,并且没有额外的数据,甚至是时间数据,这是一个 LONG AlarmReceiver.kt:

private const val TAG = "AlarmReceiver"

class AlarmReceiver: BroadcastReceiver() {
    private lateinit var myNotification: MyNotification

    override fun onReceive(context: Context, intent: Intent) {
        Log.e(TAG, "onReceive: INTENT ------>>>>>>>---------->>>>>>>>>------->>>>>>>>>---------->>>>>>: "
                + intent.hasExtra(Constants.EXTRA_EXACT_ALARM_TIME) )
        when(intent.action){

            Constants.ACTION_SET_EXACT_ALARM_REMINDER -> {
                val time: Long = intent.getLongExtra(Constants.EXTRA_EXACT_ALARM_TIME, 0L)
                val item: CustomParcelable? = intent.getParcelableExtra(Constants.EXTRA_EXACT_ALARM_ITEM)
                Log.e(TAG, "onReceive: ------------@@@@@@@@@@@@*-------------@@@@@@@@@------------"
                        + item?.title + " reminder: " + item?.reminder + " t: " + time)

                if (item != null) {
                    myNotification = MyNotification(context)
                    myNotification.createReminderNotificationChannel(item)
                    myNotification.sendNotificationReminder(item)
                }
            }
        }
    }

}

我想在 Intent 中传递的项目是 Parcelable:

项目:

@Parcelize
data class CustomParcelable(
    val title: String,
    val reminder: String
) : Parcelable {
}

清单文件我使用了所需的权限,并希望在手机重启后使警报可用。 AndroidManifest:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<receiver android:name=".receiver.AlarmReceiver"
    android:exported="true"
    android:enabled="true">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
    </intent-filter>
</receiver>

【问题讨论】:

    标签: android kotlin broadcastreceiver alarmmanager


    【解决方案1】:

    我找到了解决方案,它们是如何工作的。 只需将 Parcelable 项目添加到捆绑包中:

    class AlarmService @Inject constructor(
        @ApplicationContext private val context: Context
        ) {
        
     ...
        fun reminderAlarm(timeInMillis: Long, item: CustomParcelable){
            val intent = Intent(context, AlarmReceiver::class.java)
            intent.apply {
                action = Constants.ACTION_SET_EXACT_ALARM_REMINDER
            }
            
            val bundle = Bundle()
            bundle.putParcelable(Constants.EXTRA_EXACT_ALARM_ITEM, item)
    
            intent.putExtra(Constants.EXTRA_EXACT_ALARM_DATA, bundle)
    
            
            setAlarm(timeInMillis, getPendingIntent(intent))
        }
    }
    

    现在在接收方,您可以访问额外的意图:

    class AlarmReceiver: BroadcastReceiver() {
        private lateinit var myNotification: MyNotification
    
        override fun onReceive(context: Context, intent: Intent) {
            val data: Bundle? = intent.getBundleExtra(Constants.EXTRA_EXACT_ALARM_DATA)
    
           
            when(intent.action){
    
                Constants.ACTION_SET_EXACT_ALARM_REMINDER -> {
                    val data: Bundle? = intent.getParcelableExtra(Constants.EXTRA_EXACT_ALARM_DATA)
                    val item: CustomParcelable? = null
    
                    if (data != null){
                        item = data.getParcelable(Constants.EXTRA_EXACT_ALARM_ITEM)
                    
                        if (item != null) {
                            myNotification = MyNotification(context)
                            myNotification.createReminderNotificationChannel(item)
                            myNotification.sendNotificationReminder(item)
                        }
                    }
                }
            }
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多