2011-12-20 8 views
5

Я хочу включить дисплей, разблокировать телефон и перенести мое приложение на передний план, когда активируется будильник, который я установил.Принесите приложение на передний план, включите дисплей и откройте из 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(); 
    } 
} 

вибратор из моей CountDownTimer активируется, но дисплей не включается ...

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

На стороне записки, я хочу играть звуковой сигнал «Позитивный». Как мне это сделать?

ответ

11

Вы должны приобрести блокировку слежения с помощью PowerManager.ACQUIRE_CAUSES_WAKEUP и PowerManager.FULL_WAKE_LOCK.

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

Медведь также в виду, что если вы отпустите будить блокировки сразу после startActivity() вызывается, активность не может начаться, потому что это асинхронный вызов. Я предлагаю использовать WakefulServiceIntent или PowerManager.WakeLock.acquire(long timeout)

+0

Спасибо! Теперь дисплей включается, но как разблокировать экран? –

+0

вы можете попытаться убрать блокировку ключа http://stackoverflow.com/questions/4352548/how-to-unlock-the-screen-when-broadcastreceiver-is-called – bart

+0

@bart, не могли бы вы объяснить, как спуститься вниз PowerManager.WakeLock.acquire (длинный тайм-аут). Все еще немного смущен. – MobileMon

5

В DescClock это делается следующим образом:

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

, проблема здесь в том, что getWindow () не доступен из-за ... – Ewoks

+0

Это сработало отлично! FLAG_KEEP_SCREEN_ON будет держать экран включенным и ярким, пока текущее окно не станет видимым для пользователя. Вызов finish(); программным способом или разрешить пользователю завершить его вручную, чтобы вернуться в нормальный режим. Надеюсь, это поможет кому-то. подробнее https://developer.android.com/reference/android/view/WindowManager.LayoutParams.html#FLAG_KEEP_SCREEN_ON – mili

1

Как я могу видеть OnReceive вызывается с интервалом pendingIntent. На моем устройстве только первый вызов onReceive приобрел WakeLock. Если я нажму кнопку suspend, то второй вызов wl.acquire() не смог запустить систему. Мне нужен релиз() первый, за которым следует приобретать()

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

вы пропустили что-то, потому что это не звучит правильно ..: S – Ewoks

2

Перейти к деятельности, которые вы хотите, чтобы начать в OnReceive(). Вставить это в OnCreate() этой деятельности

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

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

  • Нет связанных вопросов^_^