2011-12-20 20 views
5

Voglio accendere il display, sbloccare il telefono e portare la mia app in primo piano, quando si attiva la sveglia che ho impostato.Portare l'app in primo piano, attivare il display e sbloccarlo da 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(); 
    } 
} 

Il vibratore dal mio CountDownTimer viene attivato, ma il display non si accende ...

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); 
    } 
} 

Una nota a parte, voglio giocare il suono di allarme "Positive". Come faccio a fare questo?

risposta

11

È necessario acquisire il blocco della sveglia con PowerManager.ACQUIRE_CAUSES_WAKEUP e PowerManager.FULL_WAKE_LOCK.

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

Anche tenere a mente che se si rilascia scia diritto di blocco dopo startActivity() viene chiamato, l'attività potrebbe non iniziare perché è chiamata asincrona. Suggerisco di usare WakefulServiceIntent o PowerManager.WakeLock.acquire(long timeout)

+0

Grazie! Ora il display si accende, ma come posso sbloccare lo schermo? –

+0

puoi provare a ignorare il blocco a chiave http://stackoverflow.com/questions/4352548/how-to-unlock-the-screen-when-broadcastreceiver-is-called – bart

+0

@bart, puoi spiegare come scendere PowerManager.WakeLock.acquire (lungo timeout). Ancora un po 'confuso. – MobileMon

5

Nella DescClock è fatto nel modo seguente:

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

il problema qui è che getWindow () non è disponibile in Attività ... – Ewoks

+0

Questo ha funzionato alla grande! FLAG_KEEP_SCREEN_ON manterrà lo schermo acceso e luminoso fino a quando la finestra corrente non sarà visibile all'utente. Call finish(); programmaticamente o consentire all'utente di completarlo manualmente per tornare alla modalità normale. Spero che questo possa aiutare qualcuno. maggiori informazioni https://developer.android.com/reference/android/view/WindowManager.LayoutParams.html#FLAG_KEEP_SCREEN_ON – mili

1

Come posso vedere OnReceive si chiama con un intervallo pendingIntent. Sul mio dispositivo solo la prima chiamata di onReceive è stata acquisita da WakeLock. Se premo il pulsante suspend nel frattempo, la seconda chiamata di wl.acquire() non è stata in grado di far salire il sistema. Ho bisogno di un rilascio() prima seguita da un acquire()

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

ti sei perso qualcosa perché questo non suona corretto ..: S – Ewoks

2

Vai alla attività che si desidera avviare in OnReceive(). Incolla questo in onCreate() di detta attività

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); 
Problemi correlati