2011-03-19 66 views
4

我想在我的活動中使用報警管理器。我建立了一個鬧鐘,以在類似這樣的主要活動的方法的onPause,AlarmManager和WakeLock

Intent intent= new Intent(namaz_vakti_activity.this, namaz_vakti_activity.class); 
PendingIntent sender = PendingIntent.getActivity(this, 1234567, intent,Intent.FLAG_ACTIVITY_NEW_TASK); 

AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE); 
eltime=Calendar.getInstance().getTime().getHours()*60+Calendar.getInstance().getTime().getMinutes(); 
eltime=(long)(Sun_Rise*60)-eltime; 
if (eltime<0) 
    eltime=eltime+24*60; 
eltime=eltime-pre_time; 
if (eltime<=0) 
    eltime=eltime+24*60; 
if (uyandirma) 
{ 
    am.set(AlarmManager.RTC_WAKEUP, Calendar.getInstance().getTimeInMillis()+eltime*60000, sender); 
    Toast.makeText(this,"Uyandirma saati "+ConvertTime(Sun_Rise-pre_time/60.0),Toast.LENGTH_SHORT).show(); 
} 
else 
{ 
    am.cancel(sender); 
} 

namaz_vakti_activity是我的主要活動。 onPause和onResume方法屬於它。

我還在onResume方法中使用wakelock來防止發生睡着的模式。

pm = (PowerManager)this.getSystemService(Context.POWER_SERVICE); 
wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK |PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.ON_AFTER_RELEASE,"namaz_vakti_activity"); 
wl.acquire(); 

該代碼的主要目的是在特定時間再次啓動我的主要活動(namaz_vakti_activitiy)。如果設備未處於睡眠模式,則代碼運行良好。但是,如果它處於睡眠模式,它會發出錯誤並停止工作。我認爲解決方案非常簡單,而且我的代碼非常簡單。

+0

@Peter,wakelock是否負責保持設備開啓,AlarmManager負責喚醒設備進入睡眠狀態? – ransh 2017-01-11 06:50:48

回答

2

您使用

am.set(AlarmManager.RTC_WAKEUP, Calendar.getInstance().getTimeInMillis()+eltime*60000, sender); 

設置鬧鐘,並在其中使用AlarmManager.RTC_WAKEUP,所以我相信即使設備處於睡眠狀態,你的意圖啓動活動將陸續推出。也許你不需要一個喚醒鎖。

當您使用wakelock時,您需要此權限:android.permission.WAKE_LOCK。這是你代碼中的問題嗎?

+0

感謝您的快速回復。錯誤的主要原因是在onCreate方法初始化一個mediplayer。完美的代碼失明:)我把它移動到onResume方法現在效果很好。但是我無法打開屏幕並在活動中獲得付款。現在試圖做到這一點。 – Mesut 2011-03-19 16:29:51

+0

@ Huang,wakelock是否負責保持設備開啓,AlarmManager負責喚醒設備進入睡眠狀態? – ransh 2017-01-11 06:50:25

7

現在下面的代碼完美地工作。

  • alarmmanager運行良好。然而,它不在屏幕上,所以我必須使用警報管理器喚醒設備(你是絕對正確的,黃),但是活動不能得到焦點。所以,我必須定義一個新行(使用Android 2.0或以上版本支持這些標誌:getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);

彙總代碼如下

public void onCreate(Bundle savedInstanceState) 

... 

    getWindow().addFlags(
     WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD| 
     WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON| 
     WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 

... 


protected void onResume() 

    ... 

//pm = (PowerManager)this.getSystemService(Context.POWER_SERVICE); 
//wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK,"namaz_vakti_activity"); 
//wl.acquire(); 

MPX=MediaPlayer.create(this, R.raw.azan1); 

... 

if (eltime==0 && uyandirma && !MPX.isPlaying()) 
{ 
    MPX.setVolume(1,1); 
    MPX.start(); 
} 


protected void onPause() 

    ... 

    Intent intent= new Intent(namaz_vakti_activity.this, namaz_vakti_activity.class); 
    PendingIntent sender = PendingIntent.getActivity(this, 1234567, intent,Intent.FLAG_ACTIVITY_NEW_TASK); 

    AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE); 
    eltime=Calendar.getInstance().getTime().getHours()*60+Calendar.getInstance().getTime().getMinutes(); 
    eltime=(long)(Sun_Rise*60)-eltime; 
    if (eltime<0) 
     eltime=eltime+24*60; 
    eltime=eltime-pre_time; 
    if (eltime<=0) 
     eltime=eltime+24*60; 
    if (uyandirma) 
    { 
     am.set(AlarmManager.RTC_WAKEUP, Calendar.getInstance().getTimeInMillis()+eltime*60000, sender); 
     Toast.makeText(this,"Uyandirma saati "+ConvertTime(Sun_Rise-pre_time/60.0),Toast.LENGTH_SHORT).show(); 
    } 
    else 
    { 
     am.cancel(sender); 
    } 

    if (MPX.isPlaying()) 
    { 
     MPX.pause(); 
     MPX.release(); 
    } 

    //if (wl.isHeld()) wl.release(); 
+0

您使用了'BroadcastReceiver'?或者它不是必需的? – 2014-01-31 21:02:47

2

我面臨同樣的問題,最有趣的。事情是,它正在對三星Galaxy S二重奏而不是Galaxy Nexus的。我的解決方案是創建廣播reciever onReciever()方法的靜態鎖。

private static PowerManager.WakeLock wakeLock; 

public static void acquireWakeLock(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, 
      "aqs_wake_lock"); 
    wakeLock.acquire(); 
} 

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

電話交流在調用startActivity()之前調用quireWakeLock(),然後在OnCreate()方法中啓動活動,我在延遲一段時間後播放鬧鐘聲音,即在onPause()和停止鬧鐘聲音時,我正在完成活動並釋放wakeLock,方法是調用releaseWakeLock ()。

new Handler().postDelayed(new Runnable() { 

     @Override 
     public void run() { 
      playSound(getApplicationContext(), getAlarmUri()); 
     } 
    }, 1000); 

希望它能幫助某人。

+0

推遲了伎倆,謝謝隊友 – Leebeedev 2015-11-09 21:51:58