android – 使用ONE_SHOT标志等待意图

前端之家收集整理的这篇文章主要介绍了android – 使用ONE_SHOT标志等待意图前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
目前我有这个代码
public static void setupAlarm(Context context) {
        Intent myIntent = new Intent(context,Receiver.class);

        PendingIntent pendingIntent = PendingIntent.getBroadcast(context,myIntent,PendingIntent.FLAG_NO_CREATE);
        if (pendingIntent != null) {
            return;
        } else {
            pendingIntent = PendingIntent.getBroadcast(context,PENDING_INTENT_RETRY,PendingIntent.FLAG_ONE_SHOT);
        }

        AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(System.currentTimeMillis());
        calendar.add(Calendar.MINUTE,2);
        alarmManager.set(AlarmManager.RTC_WAKEUP,calendar.getTimeInMillis(),pendingIntent);
    }

我想要的是一次使用待定意图并等待火灾.如果在此期间有人要求新警报,如果警报存在,我不想设置任何东西.现在我的问题是:在第一次警报之后,由于ONE_SHOT标志而导致挂起的意图被删除,但是我可以再次创建待处理的意图吗?

解决方法

是的,当然你可以再创建它.您将从第一个获得不同的PendingIntent.

但是,您发布的代码存在一些问题.首先,您创建PendingIntent,如下所示:

pendingIntent = PendingIntent.getBroadcast(context,PendingIntent.FLAG_ONE_SHOT);

但你检查它是否像这样存在:

pendingIntent = PendingIntent.getBroadcast(context,PendingIntent.FLAG_NO_CREATE);

此检查将始终返回null,因为您使用的是另一个requestCode!当您创建PendingIntent时,您将PENDING_INTENT_RETRY作为requestCode传递,但是当您检查它是否存在时,您将0传递为requestCode.

第二个问题是FLAG_ONE_SHOT的工作方式.如果使用FLAG_ONE_SHOT创建PendingIntent然后尝试使用FLAG_NO_CREATE获取PendingIntent,它将始终返回null,即使尚未使用PendingIntent!由于此行为,如果您使用使用FLAG_ONE_SHOT创建的PendingIntent设置了该警报,则无法使用FLAG_NO_CREATE来确定警报是否处于挂起状态.

如果您确实想使用此架构,则无法使用FLAG_ONE_SHOT.只需正常创建PendingIntent(不带标志)并使用FLAG_NO_CREATE检查其存在.

猜你在找的Android相关文章