2013-03-19 2 views
1

Я задал аналогичный вопрос раньше, но затем проблемы были исправлены после добавления WakeLock. Некоторое время прошло, и проблема вернулась.Запуск активности задерживается (с WakeLock)

Фон - это приложение для сигнализации, с сигналом тревоги. Начало работы от BroadcastReceiver (код ниже). Проблема началась случайно, раньше проблем не было. Приложение имеет встроенная Logger, что позволяет экономить журналы в базу данных - вся информация об ошибке я пришел из журнала, посланного пользователем - ошибка никогда не произошло со мной ... Вход:

880. 6/3 5:0:1 - == Logger initialized == from AlarmReceiver 
881. 6/3 5:0:1 - sending START ALARM 
882. 6/3 5:0:1 - WakeLock creating 
883. 6/3 5:0:1 - WakeLock acquiring for 300000 
884. 6/3 5:0:2 - START ALARM send 
885. 6/3 5:0:2 - logger initialized again from StartAlarmReceiver 
886. 6/3 5:0:2 - logger initialized again from Main 
887. 6/3 5:0:3 - start initializeTask //from Main.onCreate 
888. 6/3 5:0:3 - Main start 
889. 6/3 5:0:4 - Main resume 
890. 6/3 5:0:4 - Main pause 
891. 6/3 5:0:4 - Main stop 
... not relevant 
894. 6/3 6:0:0 - logger initialized again from AlarmOnScreen create 

AlarmReceiver:

public void onReceive(Context context, Intent intent) { 
    Logger.initialize(context, "AlarmReceiver"); 
    if (call_is_on) { 
     postAgainIn5Sec(); 
    } else { 
     Utils.log("sending START ALARM"); 
     CountedWakeLock.acquireLock(context); // acquired for 30000 millis 
     Intent i = new Intent(); 
     i.setAction(StartAlarmReceiver.ACTION_START_ALARM); 
     i.putExtras(intent.getExtras()); 

     context.sendOrderedBroadcast(i, null); 
     Utils.log("START ALARM send"); 
    } 
} 

StartAlarmReceiver:

public void onReceive(Context context, Intent intent) { 
    Logger.initialize(context, "StartAlarmReceiver"); 
    Intent i = new Intent(context, AlarmOnScreen.class); 
    Bundle extras = intent.getExtras(); 
    i.putExtras(extras); 
    i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    context.startActivity(i); 
} 

AlarmOnScreen (с андроид: launchMode = "singleTask")

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    try { 
     setContentView(R.layout.alarm_on_screen); 
     Logger.initialize(this, "AlarmOnScreen create"); 
    //... 

CountedWakeLock:

public synchronized static void acquireLock(Context context, long delay) { 
    if (sWakeLock == null) { 
     Utils.log("WakeLock creating"); 
     PowerManager pm = (PowerManager) context.getApplicationContext() 
       .getSystemService(Context.POWER_SERVICE); 
     sWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, 
       "AlarmReceiver lock"); 
     sWakeLock.setReferenceCounted(false); 
     sLockCount = 0; 
    } 

    Utils.log("WakeLock acquiring for " + delay); 
    sLockCount++; 
    sWakeLock.acquire(delay); 
} 

TL; DR - это заняло около часа для AlarmOnScreen активности вызвать его OnCreate метод после startActivity называется.

Вопрос: почему активность не началась сразу после вызова startActivity? Кроме того, могу ли я предотвратить запуск Main при запуске Alarm? Я делаю некоторую загрузку в потоке, запущенном методом onCreate, и это бессмысленно, когда Main не должен даже отображаться.

ответ

0

В следующем журнале выяснено, что проблемы вызваны тем, что WakeLock не работает должным образом - для получения более подробной информации перейдите по ссылке WakeLock with PARTIAL_WAKE_LOCK is not working

Смежные вопросы