4

我对 PendingIntents 有一些麻烦。每次打开我的应用程序时,它都会安排一些广播。我的问题是无法识别已经存在的 PendingIntents。

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

她是我的代码……在我的 Launcher Activity 中作为 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);

        }

每次都执行完全相同的代码,但为什么挂起的变量不为空?它一定要是 !!!我对 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);

    }

}

编辑 2

好的,如果已经安排了未决意图,则返回非空结果是有意义的。我已经更改了我的代码。每次我旋转手机时,都会触发主要活动 onCreate 并执行调度 asynctask。但结果始终为空?!?!如果已经有预定的pendingintent,它应该是一个非空结果,对吧?

@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);
    }

}
4

2 回答 2

9

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

文档说这是相反的,但这是错误的:-(

于 2014-03-09T16:47:57.640 回答
4

该系统完全按照文档所述执行:

int FLAG_NO_CREATE

指示如果所描述的 PendingIntent 尚不存在的标志,则简单地返回 null 而不是创建它。

话虽如此,如果我不想开始我的任务,如果它已经在运行,我会这样做:

AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, AlarmReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_NO_CREATE);
if (pendingIntent == null) {
    pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
    // start it only it wasn't running already
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 10 * 60 * 1000, pendingIntent);
}
于 2017-01-22T22:28:57.390 回答