2011-07-28 25 views
23

Belirli bir zamanda görüntülenecek bir aktivite istiyorum. Bunun için AlarmManager kullanıyorum. Cihaz uyanıkken iyi çalışıyor, ancak uykudaysa uyanmıyor. Alarmı ayarlamak içinandroid AlarmManager telefonu uyandırmıyor

Kodum:

Calendar alarmTime = Calendar.getInstance(); 
alarmTime.set(Calendar.HOUR_OF_DAY, alarm.hour); 
alarmTime.set(Calendar.MINUTE, alarm.minute); 
alarmTime.set(Calendar.SECOND, 0); 

if (alarmTime.before(now)) 
    alarmTime.add(Calendar.DAY_OF_MONTH, 1); 

Intent intent = new Intent(ctxt, AlarmReceiver.class); 
intent.putExtra("alarm", alarm); 
PendingIntent sender = PendingIntent.getBroadcast(ctxt, alarm.id, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
alarmManager.set(AlarmManager.RTC_WAKEUP, alarmTime.getTimeInMillis(), sender); 

My yayın alıcısı:

@Override 
public void onReceive(Context context, Intent intent) { 
    try { 

Bundle bundle = intent.getExtras(); 
final Alarm alarm = (Alarm) bundle.getSerializable("alarm"); 

Intent newIntent; 
if (alarm.type.equals("regular")) { 
    newIntent = new Intent(context, RegularAlarmActivity.class); 
} else if (alarm.type.equals("password")) { 
    newIntent = new Intent(context, PasswordAlarmActivity.class); 
} else if (alarm.type.equals("movement")) { 
    newIntent = new Intent(context, MovementAlarmActivity.class); 
} else { 
    throw new Exception("Unknown alarm type"); 
} 
    newIntent.putExtra("alarm", alarm); 
    newIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    context.startActivity(newIntent); 

} catch (Exception e) { 
    Toast.makeText(context, "There was an error somewhere, but we still received an alarm", Toast.LENGTH_SHORT).show(); 
    Log.e("AlarmReceiver", Log.getStackTraceString(e)); 
} 
} 

Bu kod cihazı uyandırmak etmez. Ancak, tekrar açtığımda, görüntülenir. Ekranı açmaları için onlara ihtiyacım var. Bu problemde bana yardımcı olabilir misiniz?

+0

Git sen OnReceive başlamak istediğiniz Etkinlik(). Bu işlemin onCreate() yöntemine yapıştırın Son Pencere 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); – Junaid

cevap

55

Benzer bir sorunla karşılaştım ve çözüm WakeLocker'ı kullanmaktı. Bu yapılmalıdır (tercihen alıcıdaki ilk şey olarak) veya alarm alındığında cihaz uyanacak, ancak context.startActivity(newIntent)'dan önce tekrar uykuya dalacak; denir. (bunun olmaması zaman biraz keyfi olarak görünüyor bu yüzden de, davranış gözlemledim) Yani kolay ve hızlı cevap: bu kaynak kodu ile WakeLocker denilen yeni bir sınıf olun:

package mypackage.test; 

import android.content.Context; 
import android.os.PowerManager; 

public abstract class WakeLocker { 
    private static PowerManager.WakeLock wakeLock; 

    public static void acquire(Context ctx) { 
     if (wakeLock != null) wakeLock.release(); 

     PowerManager pm = (PowerManager) ctx.getSystemService(Context.POWER_SERVICE); 
     wakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK | 
       PowerManager.ACQUIRE_CAUSES_WAKEUP | 
       PowerManager.ON_AFTER_RELEASE, MainActivity.APP_TAG); 
     wakeLock.acquire(); 
    } 

    public static void release() { 
     if (wakeLock != null) wakeLock.release(); wakeLock = null; 
    } 
} 

ve alıcınızda, 1 şey olarak WakeLocker.acquire(context);'u arayın. Ekstra: Alarmınız bir şey yaptığında, WakeLocker.release();'u aramak da uygun olacaktır.

+2

Çok teşekkür ederim. Şimdi, telefon sonunda belirtilen zamanda uyanır. WakeLocker sınıfının statik yaklaşımını da çok beğeniyorum. – Gabriel

+7

izin gerektirir http://developer.android.com/reference/android/os/PowerManager.html – Palani

+0

Teşekkür ederim, bu harika. Ancak, telefonumun (Asus Zenfone Selfie) uygulamasının açık bir şekilde uyandırılmasına izin vermem gerektiğini belirleyene kadar hala işe yaramadı. – cpliu338

30

Büyük olasılıkla, alarm cihazı uyandırıyor. Ancak, AlarmManager yayınları ekranı açmayacak ve cihaz etkinliğiniz başlamadan önce uykuya dalabilir.

Sen startActivity() çağırmadan önce onReceive() bir WakeLock kazanmak ve kullanıcı etkinlik yanıt sonrasında WakeLock açıklayamazsınız gerekecektir

.

+0

Doğru cevap budur. ^^^ – user123321

+0

bunu test ettiniz mi? Ekran, bir WakeLock – 2cupsOfTech

+0

@ 2cupsOfTech elde etme ihtiyacı olmadan da açılıyor: "bunu test ettiniz mi?" -- Evet. "Ekran bir WakeLock edinme ihtiyacı olmadan da açılır" - "AlarmManager" yayınları ekranı açmaz. Bir "WakeLock" olmadan (ör., GetService() 'yi bir' PendingIntent' olarak kullanarak, bir WakeLock’u hizmette yakalama güvenilmezdir. Bazen işe yaramaz ve başkalarına değil. Bu yüzden "WakefulIntentService" yi yayınladım ve Google bunu neden "WakefulBroadcastReceiver" ile takip etti. – CommonsWare

İlgili konular