вы должны сделать это, используя типы классов и метод IsAssignableFrom
public class Program
{
public static void Main()
{
A a = new A0();
a.CheckDerived();
}
}
class A0 : A {};
class A1 : A {};
class A2 : A {};
class A {
public void CheckDerived() {
if(this.GetType().IsAssignableFrom(typeof(A0))) Console.Write("A0");
if(this.GetType().IsAssignableFrom(typeof(A1))) Console.Write("A1");
if(this.GetType().IsAssignableFrom(typeof(A2))) Console.Write("A2");
}
}
Проблема, которую вы видите, - это способ, которым теперь работают повторяющиеся сигналы тревоги . Чтобы сохранить время автономной работы, AlarmManager
теперь принимает большие свободы в перенастройке аварийных сигналов, чтобы группировать несколько сигналов тревоги вместе. В принципе, если вам нужно какое-то точное время, вы должны забыть об использовании setRepeating()
. Вместо этого используйте setExact()
. Если вам нужен повторный сигнал тревоги, просто сбросьте его, когда он погаснет.
Похоже, что поле requestCode
в вашем вызове getBroadcast
не всегда делает его уникальным. См. Второй комментарий по этому вопросу: Что такое & quot; requestCode & quot; используется для PendingIntent?
Поскольку «лишнее» содержимое не различает их, кто-то обнаружил, что настройка разных данных в Intent сработала: https://stackoverflow.com / а / 33203752/508608
Причиной этого является то, что намерения не являются индивидуальными. Они повторно используются, когда данные одинаковы (как в вашем случае)
Из doc :
Обычная ошибка, которую люди делают, это создайте несколько объектов PendingIntent с намерениями, которые изменяются только в их «лишнем» содержимом, и каждый раз он будет получать другой PendingIntent. Этого не происходит. Части намерения, которые используются для сопоставления, являются теми же, что определены Intent.filterEquals. Если вы используете два объекта Intent, которые эквивалентны Intent.filterEquals, тогда вы получите тот же PendingIntent для обоих из них.
blockquote>