Надежность диспетчера аварийных сигналов

Я боролся с этой проблемой несколько дней. Я также проверил документацию и несколько тем, но не нашел решения / объяснения.
Я тестирую свое приложение на LG p500, но я также провел несколько тестов на Droid и получил тот же результат.

Мое приложение использует AlarmHandler для планирования будильника.Приложение корректно работает на эмуляторе, а также на устройстве, пока на устройстве не будет достаточно свободной памяти. Когда я запускаю на устройстве несколько других приложений, а памяти мало, тревога больше не срабатывает. Как только я останавливаю "другое" приложение, будильник снова работает нормально.

Позвольте мне сообщить о тесте и результате.

  1. Я установил будильник в своем приложении через 10 минут.
  2. Я запускаю несколько приложений ( браузер, карта Google, Gmail, K9Mail, ....)
  3. Я запускаю журнал каталогов, чтобы увидеть журнал своего приложения
  4. Подождите 15 минут, не работая с телефоном
  5. Через 10 минут должен сработать будильник но ничего не происходит, пока я не просыпаю свой телефон нажатием кнопки
  6. Когда я выхожу из спящего режима свой телефон, немедленно срабатывает будильник, и все уведомления происходят.
  7. Я останавливаю "другое" приложение, которое я ранее запустил (браузер, карта Google, ...)
  8. Установить снова будильник через 10 минут
  9. Я запускаю журнал каталогов, чтобы увидеть журнал моего приложения
  10. Жду, не работая по телефону
  11. Через 10 минут срабатывает будильник, и я получаю уведомление .

Я проделал этот тест несколько раз и получил тот же результат.
Затем я попытался установить будильник с помощью приложения "Catch", которое я ранее загрузил с магазина, и у меня такое же поведение, поэтому похоже, что это не проблема моего приложения.

Глядя на журнал моего приложения, я делаю это. не вижу никаких ошибок / исключений, но похоже, что когда в системе мало памяти, что-то происходит, и приемник широковещательной передачи не запускается, пока телефон не проснется с помощью клавиатуры. Как только я просыпаю телефон, включается приемник и происходит уведомление.

Вот код, который я использовал:

Получатель:

public class NotificationReceiver extends BroadcastReceiver
{
public static final String LOG_TAG = "YAAS - Notification Receiver";

@Override
public void onReceive(Context context, Intent intent)
{
    ScheduleActivityService.acquireStaticLock(context);
    Log.i(LOG_TAG, "Received alarm - id: " + intent.getIntExtra("id", -1));
    Intent intent2 = new Intent(context, ScheduleActivityService.class);
    intent2.putExtra("id", intent.getIntExtra("id", -1));
    context.startService(intent2);
}
}

Служба

public class ScheduleActivityService extends Service
{
public static final String LOCK_NAME_STATIC="it.hp.yaas.AppService.Static";
public static final String LOG_TAG = "YAAS - ActivityService";
private static PowerManager.WakeLock lockStatic = null;

private final IBinder mBinder = new LocalBinder();

public class LocalBinder extends Binder
{
    public ScheduleActivityService getService()
    {
        return ScheduleActivityService.this;
    }
}

@Override
public IBinder onBind(Intent intent)
{
    return mBinder;
}

public static void acquireStaticLock(Context context) {
    getLock(context).acquire();
}

synchronized private static PowerManager.WakeLock getLock(Context context)
{
    if (lockStatic == null)
    {
        PowerManager mgr = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
        lockStatic = mgr.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, LOCK_NAME_STATIC);
        lockStatic.setReferenceCounted(true);
    }
    return(lockStatic);
}

/**
 * This method is called when an alarm fires that is its alarm time is reached.
 * The system assume that the alarm fired match the alarm time of the first
 * activity.
 * @param intent intent fired
 * @param flag
 * @param startId
 */
@Override
public int onStartCommand(Intent intent, int flag, int startId)
{
    super.onStartCommand(intent, flag, startId);
    try {
        Log.i(LOG_TAG, "Alarm fired: " + startId + " - id: " + intent.getIntExtra("id", -1));
        AlarmHandler.getInstance().onAlarmFired(intent.getIntExtra("id", -1));
    }
    finally { getLock(this).release(); }
    return START_STICKY;
}

@Override
public void onDestroy()
{
    super.onDestroy();
    Log.i(LOG_TAG,  "Destroy");
}
}

Часть кода из AlarmHandler, подпрограммы, вызываемой для планирования сигнала тревоги:

    public synchronized void onAlarmFired(int alarmId)
{
    scheduledAlarmId = -1;
    Alarm alarmFired = pop();
    if (alarmFired == null) return;
    Log.i(LOG_TAG, "onAlarmFired (Alarm: " + alarmFired + ") at (time: " + Utilities.convertDate(new Date(), "HH:mm:ss") + ")");
    notifyAlarmListener(alarmFired);
    if (alarmFired.reschedule(null) != null) add(alarmFired);
    Alarm alarm = peek();
    if (alarm != null && scheduledAlarmId != alarm.getId()) scheduleEvent(alarm);
}

/**
 * Schedule an alarm through AlarmManager that trigger next activity notification
 * @param alarm alarm to be scheduled
 */
private void scheduleEvent(Alarm alarm)
{
    Log.i(LOG_TAG, "scheduleEvent - (Alarm: " + alarm + ")");
    Intent intent = new Intent(context, NotificationReceiver.class);
    intent.putExtra("id", alarm.getId());
    // In reality, you would want to have a static variable for the request code instead of 192837
    PendingIntent sender = PendingIntent.getBroadcast(context, 192837, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    // Get the AlarmManager service
    AlarmManager am = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
    am.set(AlarmManager.RTC_WAKEUP, alarm.getTime().getTime(), sender);
    scheduledAlarmId = alarm.getId();
}

И, наконец, это часть файла манифеста :

    <activity android:name=".ListActivity"
          android:label="@string/app_name">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
    </activity>

    <activity android:name=".EditActivity"/>

    <activity android:name=".SettingsActivity"/>

    <service android:name="ScheduleActivityService"
             android:label="YAAS Service"/>

    <receiver  android:name="NotificationReceiver" />
8
задан Marco Cravero 8 August 2011 в 15:42
поделиться