Приемник тревог работает как действие?

Мне нужно установить ежедневный будильник. Я прочитал здесь много вопросов/решений и следовал тому, что, по моему мнению, сработает. Я вижу, что мои будильники устанавливаются (благодаря этому сообщению ). Я вижу, что будильник установлен, и его переназначают на повтор через 24 часа, но мой получатель не звонит. поэтому я должен предположить, что проблема в моей реализации AlarmReceiver.

Мой файл манифеста выглядит так:

<uses-permission android:name="com.android.alarm.permission.SET_ALARM"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >

     <activity
        android:name="com.TLD.testclock.TestClock"
        android:configChanges="orientation|keyboardHidden|screenSize"
        android:label="@string/app_name"
        android:theme="@style/FullscreenTheme" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

      <receiver android:name="com.TLD.testclock.AlarmReceiver"
         android:enabled="true"
         android:exported="true" 
         android:permission="android.permission.WAKE_LOCK" /> 

Мой setAlarm код:

alarmMgr = (AlarmManager) context.getSystemService(ALARM_SERVICE);
Intent intent = new Intent(TestClock.this, AlarmReceiver.class);
intent.putExtra("AlarmId", mAlarm.alarmId);
pendingIntent = PendingIntent.getActivity(TestClock.this,
            mAlarm.alarmId, intent, pendingIntent.FLAG_UPDATE_CURRENT);

// Set the alarm
alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP,
            alarmCalendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY,
            pendingIntent);

Действия получателя:

public class AlarmReceiver extends Activity {
private MediaPlayer mPlayer;
private WakeLock mWakeLock;

@Override
@SuppressWarnings("deprecation")
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Log.v("AlarmReceiver", "Alarm finished?");

    PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
    mWakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK, "my wakelock");
    mWakeLock.acquire();
    this.requestWindowFeature(Window.FEATURE_NO_TITLE);
    this.getWindow().setFlags(
            WindowManager.LayoutParams.FLAG_FULLSCREEN
                    | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
                    | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON,
            WindowManager.LayoutParams.FLAG_FULLSCREEN
                    | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
                    | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);

    setContentView(R.layout.alarm_alert);
    // intent.getExtra("AlarmId", mAlarm.alarmId);
    Button stopalarm = (Button) findViewById(R.id.dismiss);

    stopalarm.setOnClickListener(new View.OnClickListener() {...

Дамп системной сигнализации показывает:

RTC_WAKEUP #3: Alarm{40bc13f8 type 0 com.TLD.testclock} 

type=0 when=+6h39m58s976ms repeatInterval=86400000 count=1    

operation=PendingIntent{40b5f218: PendingIntentRecord{40bc13c0 com.TLD.testclock startActivity}}

Broadcast ref count: 0   

Статистика будильника:

com.TLD.testclock  27ms running,
2 wakeups    2 alarms: flg=0x4 cmp=com.TLD.testclock/.AlarmReceiver

Я занимался этим несколько дней, но инструмент дампа, наконец, доказал, что сигнализация действительно была установлена. Должен ли приемник сигналов тревоги быть широковещательным приемником? Я видел, как здесь работает приемник сигналов тревоги, поэтому решил последовать его примеру. Я не получаю ошибок, но это не работает для меня. Может ли кто-нибудь увидеть, что я делаю неправильно?


person bob    schedule 19.02.2014    source источник


Ответы (1)


Ознакомьтесь с документацией AlarmManager. Метод AlarmManager.set() явно указывает, что он будет отправлять Intent как широковещательную рассылку. У вас есть настройка манифеста с тегом получателя, но указан класс Activity, а не BroadcastReceiver. Кроме того, когда вы создаете PendingIntent для регистрации в AlarmManager, вы создаете Intent для Activity, а не BroadcastReceiver. Если вам действительно нужно, чтобы Activity всплывало при срабатывании Alarm, просто сделайте так, чтобы ваш BroadcastReceiver активировал явный Intent для вашего внутреннего Activity, чтобы показать пользователю, что тревога произошла.

person Larry Schiefer    schedule 19.02.2014
comment
Спасибо. Я не могу понять, почему пример youtube (отметка 20:00) работает как действие, поскольку вы указываете, что AlarmManager.set, похоже, требует трансляции. Меня оторвали от этого проекта, и я попробую ваше решение на следующей неделе и отчитаюсь. - person bob; 20.02.2014
comment
AlarmManager может быть достаточно умен, чтобы понять, что PendingIntent нацелен на Activity, а не на Broadcast, но это определенно не документированный способ. Из предоставленного вами видео и записи журнала кажется, что это должно работать. В этом случае проблема заключается в том, что ваш файл манифеста не объявляет AlarmReceiver как Activity, а скорее как BroadcastReceiver. Измените его на действие без IntentFilter. Это сделает действие неэкспортируемым, что подходит для ваших целей. PendingIntent выполняется с разрешениями и областью действия вашего приложения. - person Larry Schiefer; 20.02.2014
comment
Мне потребовалось некоторое время, чтобы вернуться к этому, но я изменил AlarmReceiver на действие в файле манифеста. Кажется, это исправлено. Спасибо за помощь, Ларри. - person bob; 24.02.2014