سؤال

تم حلها أثناء كتابة هذا السؤال ، ولكن النشر في حال يساعد أي شخص:

أقوم بتعيين أجهزة إنذار متعددة مثل هذا ، مع قيم مختلفة من id:

AlarmManager alarms = (AlarmManager)context.getSystemService(
        Context.ALARM_SERVICE);
Intent i = new Intent(MyReceiver.ACTION_ALARM);  // "com.example.ALARM"
i.putExtra(MyReceiver.EXTRA_ID, id);  // "com.example.ID", 2
PendingIntent p = PendingIntent.getBroadcast(context, 0, i, 0);
alarms.setRepeating(AlarmManager.RTC_WAKEUP, nextMillis, 300000, p);  // 5 mins

... واستلامهم مثل هذا:

public void onReceive(Context context, Intent intent) {
    if (intent.getAction().equals(ACTION_ALARM)) {
        // It's time to sound/show an alarm
        final long id = intent.getLongExtra(EXTRA_ID, -1);

يتم تسليم المنبه إلى جهاز الاستقبال الخاص بي في الأوقات المناسبة ، ولكن في كثير من الأحيان مع EXTRA_ID ضبط على القيمة الخاطئة: إنها قيمة استخدمتها في مرحلة ما ، وليس فقط القيمة التي أردت تسليمها في هذا الوقت بالذات.

هل كانت مفيدة؟

المحلول

الوثائق ل PendingIntent.getBroadcast() يقول:

عائدات

إرجاع معلقة حالية أو جديدة تتوافق مع المعلمات المعطاة.

المشكلة هي أن اثنين من النوايا يختلفان فقط في الإضافات يبدو أنهما يتطابقان مع هذا الغرض. لذا getBroadcast() سيعود بعض العشوائي القديم المعلق (مع مختلف EXTRA_ID) بدلاً من واحدة جديدة حول القصد الذي قمت بإنشائه للتو. الإصلاح هو توفير بيانات URI وجعلها تختلف مع المعرف ، مثل هذا:

Intent i = new Intent(MyReceiver.ACTION_ALARM, Uri.parse("timer:"+id));

يمكنك بعد ذلك استرداد رقم المعرف باستخدام:

Long.parseLong(intent.getData().getSchemeSpecificPart());

... أو بالطبع تزويد الإضافية أيضًا واستخدم ذلك.

نصائح أخرى

يمكنك أيضا استخدام العلم PendingIntent.FLAG_UPDATE_CURRENT

PendingIntent p = PendingIntent.getBroadcast(context, 0, i, PendingIntent.FLAG_UPDATE_CURRENT);

هذا يجب أن يعمل أيضا

الحل لمشكلتك هو استخدام intent.flag_activity_new_task

  p = PendingIntent.getBroadcast(context, 0, i, Intent.FLAG_ACTIVITY_NEW_TASK);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top