2011-12-20 23 views
5

Tôi muốn bật màn hình, mở khóa điện thoại và đưa ứng dụng của tôi lên phía trước, khi báo thức tôi đã đặt kích hoạt.Đưa ứng dụng lên phía trước, bật màn hình và mở khóa từ 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(); 
    } 
} 

Các rung từ CountDownTimer tôi được kích hoạt, nhưng màn hình không bật ...

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

Trên một mặt lưu ý, tôi muốn chơi "tích cực" âm thanh báo động. Làm thế nào để tôi làm điều này?

Trả lời

11

Bạn nên lấy khóa đánh thức bằng PowerManager.ACQUIRE_CAUSES_WAKEUP và PowerManager.FULL_WAKE_LOCK.

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

Lưu ý rằng nếu bạn giải phóng khóa chế độ ngay sau startActivity() được gọi, hoạt động có thể không khởi động vì đó là cuộc gọi không đồng bộ. Tôi đề nghị để sử dụng WakefulServiceIntent hoặc PowerManager.WakeLock.acquire(long timeout)

+0

Cảm ơn! Bây giờ màn hình bật, nhưng làm cách nào để mở khóa màn hình? –

+0

bạn có thể thử loại bỏ khóa khóa http://stackoverflow.com/questions/4352548/how-to-unlock-the-screen-when-broadcastreceiver-is-called – bart

+0

@bart, bạn có thể giải thích cách đi xuống PowerManager.WakeLock.acquire (long timeout) tuyến đường. Vẫn còn một chút bối rối. – MobileMon

5

Trong DescClock nó được thực hiện theo cách sau:

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

vấn đề ở đây là getWindow () không có sẵn trong Hoạt động ... – Ewoks

+0

Điều này đã hiệu quả! FLAG_KEEP_SCREEN_ON sẽ giữ màn hình sáng và sáng cho đến khi cửa sổ hiện tại hiển thị với người dùng. Kết thúc cuộc gọi(); lập trình hoặc cho phép người dùng hoàn thành thủ công để quay lại chế độ bình thường. Hy vọng điều này sẽ giúp cho ai đó. thêm thông tin https://developer.android.com/reference/android/view/WindowManager.LayoutParams.html#FLAG_KEEP_SCREEN_ON – mili

1

Như tôi đã có thể nhìn thấy onReceive được gọi với khoảng pendingIntent. Trên thiết bị của tôi, chỉ cuộc gọi đầu tiên của onReceive mới có được WakeLock. Nếu tôi nhấn nút tạm dừng trong khi chờ cuộc gọi thứ hai của wl.acquire() không thể đưa hệ thống lên. Tôi cần một thông cáo() đầu tiên theo sau là một Acquire()

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

bạn đã bỏ lỡ điều gì đó gây ra điều này không đúng ..: S – Ewoks

2

Chuyển đến Hoạt động mà bạn muốn bắt đầu trong onReceive(). Dán hình này vào trênCreate() của Hoạt động đó

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); 
Các vấn đề liên quan