2013-03-19 7 views
1

이전에 비슷한 질문을했지만 WakeLock을 추가 한 후에 문제가 해결되었습니다. 약간의 시간이 지났고 문제가 다시 발생했습니다.활동 시작이 지연됨 (WakeLock 사용)

배경 - Alarm Activity가 BroadcastReceiver (아래 코드)에서 시작되는 알람 응용 프로그램입니다. 문제가 무작위로 발생하기 시작 했으므로 이전에는 문제가 없었습니다. 나는 사용자가 보낸 로그에서 온 버그에 대한 모든 정보 - - 응용 프로그램이 데이터베이스에 로그를 저장 로거 구축이 오류가 나에게 발생하지 않았다을 ... 로그 :

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 (안드로이드 : launchMode = "singleTask")

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

012,339,

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은 - 그것은 startActivity를 호출 한 후 그에서 onCreate 메소드를 호출하는 AlarmOnScreen 활동에 대한 시간 정도 걸렸다.

질문 - startActivity를 호출 한 직후에 활동이 시작되지 않은 이유는 무엇입니까? 또한 Alarm이 시작될 때 Main이 시작되는 것을 방지 할 수 있습니까? onCreate 메서드에서 시작된 스레드에서 일부로드를 수행하고 Main이 표시되지 않아야한다는 점은 의미가 없습니다.

답변