Android PendingIntent FLAG_NO_CREATE不返回null

Pas*_*cal 4 android alarmmanager android-service android-pendingintent android-background

我在PendingIntents上遇到了一些麻烦.每次我的应用程序打开时,它都会安排一些广播.我的问题是,现有的PendingIntents无法识别.

我知道必须使用相同的参数创建PendingIntents和unterlaying Intents.

她是我的代码......在我的Launcher活动中作为Asynctask开始.

        long nextExecute = getNextExecute(t);

        if (nextExecute > System.currentTimeMillis()) {

            int tt = 12;

            intent = new Intent(context, BirthExecutor.class);
            intent.putExtra(Target.ROW_ID, tt);

            PendingIntent pending = PendingIntent.getBroadcast(context, 10, intent, PendingIntent.FLAG_NO_CREATE);

            if (pending != null) {

                manager.set(AlarmManager.RTC_WAKEUP, nextExecute, pending);

                BirthLog log = new BirthLog("Scheduled " + t.getFirstname() + " " + t.getLastname() + " on " + df.format(nextExecute));
                log_helper.insertLog(log);

            } else {

                BirthLog log = new BirthLog(t.getFirstname() + " " + t.getLastname() + " already active!");
                log_helper.insertLog(log);

            }

            intent = new Intent(LogAdapter.LOG_RECEIVE_ACTION);
            context.sendBroadcast(intent);

        }
Run Code Online (Sandbox Code Playgroud)

每次都执行完全相同的代码,但为什么挂起的变量不为空?它一定要是 !!!我已经硬编码了requestId,putExtra也是硬编码的.

编辑

我有另一个功能来更新此计划.只有当我执行该函数时,才会再识别PendingIntents.我试图使用相同的上下文对象作为静态引用,但也失败了.

public void updateTask(Target t) {

    if (t.getTime() == null || t.getRow() == null)
        return;

    Intent intent;
    SimpleDateFormat df = new SimpleDateFormat("HH:mm dd.MM.yyyy", Locale.US);

    long nextExecute = getNextExecute(t);

    if (nextExecute > System.currentTimeMillis()) {

        intent = new Intent(static_context, BirthExecutor.class);
        intent.putExtra(Target.ROW_ID, 12);

        PendingIntent pending = PendingIntent.getBroadcast(static_context, 10, intent, PendingIntent.FLAG_CANCEL_CURRENT);

        if (pending != null) {

            manager.set(AlarmManager.RTC_WAKEUP, nextExecute, pending);

            BirthLog log = new BirthLog("Scheduled " + t.getFirstname() + " " + t.getLastname() + " on " + df.format(nextExecute));
            log_helper.insertLog(log);
            Log.d("birth", log.getComment());

        } else {

            BirthLog log = new BirthLog(t.getFirstname() + " " + t.getLastname() + " ERROR. TIME: " + df.format(nextExecute));
            log_helper.insertLog(log);
            Log.d("birth", log.getComment());

        }

        intent = new Intent(LogAdapter.LOG_RECEIVE_ACTION);
        static_context.sendBroadcast(intent);

    }

}
Run Code Online (Sandbox Code Playgroud)

编辑2

好吧,如果已经安排了pending-intent,它会返回非null结果.我改变了我的代码.每次我旋转手机时,主要活动onCreate都会被触发,执行调度asynctask.但结果总是为空?!?!如果已经有一个已安排的pendingintent,它应该是一个非null结果,对吗?

@Override
protected Void doInBackground(Void... params) {

    Intent intent;
    SimpleDateFormat df = new SimpleDateFormat("HH:mm dd.MM.yyyy", Locale.US);

    for (Target t : target_helper.getAllTarget()) {

        long nextExecute = getNextExecute(t);

        if (nextExecute > System.currentTimeMillis()) {

            PendingIntent pending = getPendingIntent(context, t, false);

            if (pending != null) {

                BirthLog log = new BirthLog(t.getFirstname() + " " + t.getLastname() + " already active!");
                log_helper.insertLog(log);

            } else {

                manager.set(AlarmManager.RTC_WAKEUP, nextExecute, pending);

                BirthLog log = new BirthLog("Scheduled " + t.getFirstname() + " " + t.getLastname() + " on " + df.format(nextExecute));
                log_helper.insertLog(log);

            }

            intent = new Intent(LogAdapter.LOG_RECEIVE_ACTION);
            context.sendBroadcast(intent);

        }

    }

    return null;

}

private PendingIntent getPendingIntent(Context context, Target t, boolean update) {

    Intent intent = new Intent(context, BirthExecutor.class);
    intent.putExtra(Target.ROW_ID, t.getRow());

    if (update) {
        return PendingIntent.getBroadcast(context, t.getRow().intValue(), intent, PendingIntent.FLAG_UPDATE_CURRENT);
    } else {
        return PendingIntent.getBroadcast(context, t.getRow().intValue(), intent, PendingIntent.FLAG_NO_CREATE);
    }

}
Run Code Online (Sandbox Code Playgroud)

Dav*_*ser 7

文档不正确.如果您PendingIntent.FLAG_NO_CREATE在调用时使用PendingIntent.getBroadcast()它,null 如果找不到匹配PendingIntentPendingIntent返回.否则它将返回匹配.

文档说它是另一种方式,但那是错的:-(

  • 实际上,如果你考虑它超过几秒钟,很明显,如果有匹配的`PendingIntent`则返回'null`是没有意义的,如果没有匹配则返回非null,因为通过设置` FLAG_NO_CREATE`你已经表明你**不希望Android创建一个新的'PendingIntent`**.它应该作为非null结果返回什么? (3认同)