2011-12-20 5 views
5

Quiero encender la pantalla, desbloquear el teléfono y llevar mi aplicación al frente, cuando se active la alarma que configuré.¿Lleva la aplicación al frente, enciende la pantalla y desbloquea desde AlarmManager?

public class CountDownAlarm extends BroadcastReceiver { 

    public CountDownAlarm(){ } 

    public CountDownAlarm(Context context, int timeoutInSeconds){ 
     AlarmManager alarmMgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE); 
     Intent intent = new Intent(context, CountDownAlarm.class); 
     PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
     Calendar time = Calendar.getInstance(); 
     time.setTimeInMillis(System.currentTimeMillis()); 
     time.add(Calendar.SECOND, timeoutInSeconds); 
     alarmMgr.set(AlarmManager.RTC_WAKEUP, time.getTimeInMillis(), pendingIntent); 
    } 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     PowerManager pm = (PowerManager)context.getSystemService(Context.POWER_SERVICE); 
     WakeLock wl = pm.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP, "TRAININGCOUNTDOWN"); 
     wl.acquire(); 
     Intent i = new Intent(context, MyActivity.class); 
     i.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); 
     context.startActivity(i); 
     wl.release(); 
    } 
} 

El vibrador de mi countDownTimer se activa, pero la pantalla no se enciende ...

public class MyActivity extends Activity implements OnClickListener { 

    @Override 
    public void onClick(View arg0) { 
     timer = new CountDownTimer(countDown*1000, 1000) { 
      public void onTick(long millisUntilFinished) { 
       activeBtn.setText(String.valueOf(millisUntilFinished/60000) + ":" + 
         String.format("%02d", (millisUntilFinished % 60000)/1000)); 
      } 

      public void onFinish() { 
       activeBtn.setText("0:00"); 
       Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE); 
       v.vibrate(1000); 
       ringtone = RingtoneManager.getRingtone(getApplicationContext(), 
         RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)); 
       if (ringtone != null) { 
        ringtone.play(); 
       } 
       new AlertDialog.Builder(MyActivity.this) 
       .setMessage("Time's up!") 
       .setPositiveButton("OK", new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface arg0, int arg1) { 
        } 
       }).show(); 
      } 
     }.start(); 
     new CountDownAlarm(this, countDown); 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
    } 
} 

En una nota lateral, quiero jugar el sonido de la alarma "positiva". ¿Cómo hago esto?

Respuesta

11

Debe adquirir Wake Lock con PowerManager.ACQUIRE_CAUSES_WAKEUP y PowerManager.FULL_WAKE_LOCK.

WakeLock wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "TRAININGCOUNTDOWN"); 

oso también en cuenta que si se suelta despertar derecho de bloqueo después startActivity() se llama, la actividad no se inicie debido a que es llamada asincrónica. Es mejor utilizar WakefulServiceIntent o PowerManager.WakeLock.acquire(long timeout)

+0

Gracias! Ahora la pantalla se enciende, pero ¿cómo desbloqueo la pantalla? –

+0

puede intentar cerrar el bloqueo de teclas http://stackoverflow.com/questions/4352548/how-to-unlock-the-screen-when-broadcastreceiser-is-llamado – bart

+0

@bart, ¿puede explicar cómo bajar el Ruta de PowerManager.WakeLock.acquire (tiempo de espera prolongado). Todavía un poco confundido. – MobileMon

5

En el DescClock se hace de la siguiente manera:

final Window win = getWindow(); 
    win.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED 
      | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD); 
    // Turn on the screen unless we are being launched from the AlarmAlert 
    // subclass. 
    if (!getIntent().getBooleanExtra(SCREEN_OFF, false)) { 
     win.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON 
       | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON 
       | WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON); 
    } 
+1

el problema aquí es que getWindow () no está disponible fuera de la actividad ... – Ewoks

+0

¡Esto funcionó muy bien! FLAG_KEEP_SCREEN_ON mantendrá la pantalla encendida y brillante hasta que la ventana actual esté visible para el usuario. Finalización de llamada(); programáticamente o permita al usuario terminarlo manualmente para volver al modo normal. Espero que esto ayude a alguien. más información https://developer.android.com/reference/android/view/WindowManager.LayoutParams.html#FLAG_KEEP_SCREEN_ON – mili

1

Como puedo ver OnReceive se llama con un intervalo de pendingIntent. En mi dispositivo, solo la primera llamada de onReceive fue adquirir WakeLock. Si presiono el botón suspender mientras tanto, la segunda llamada de wl.acquire() no pudo activar el sistema. Necesito un contrato de() en primer lugar, seguido de una compra()

wl.release(); 
wl.acquire(); 
+0

te perdiste algo porque esto no suena correcto ..: S – Ewoks

2

Ir a la actividad que desea iniciar en OnReceive(). Pega esto en onCreate() de esa actividad

final Window win= getWindow(); 
win.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | 
     WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD); win.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON | 
     WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); 
Cuestiones relacionadas