AlarmManager和WakeLock [英] AlarmManager and WakeLock
问题描述
我想用一个报警经理在我的活动。我设置了一个报警的主要活动的onPause方法是这样,
I want to use an alarm manager in my activity. I set up an alarm at the onPause method of main activity like this,
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方法属于它。
namaz_vakti_activity is my main activity. the onPause and onResume methods belong to it.
我还使用了wakelock在onResume方法prevent睡着模式出现。
I also use a wakelock at onResume method to prevent asleep mode to occur.
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();
的code的主要目的是启动我的主要活动(namaz_vakti_activitiy)再次在特定的时间。如果该设备不处于睡眠模式中的code效果很好。然而,如果它是在睡着模式下,它提供了一个错误并停止工作。我认为,解决办法很简单,我在code blidness。
The main purpose of the code is start my main activity (namaz_vakti_activitiy) again at a specific time. If the device is not in asleep mode the code works well. However if it is in asleep mode it gives an error and stops working. I think the solution is simple, and I am in code blidness.
推荐答案
现在的低于code完美的作品。
Now the below code works perfectly.
- alarmmanager效果很好。但是,它并没有在屏幕上,所以我必须使用wakelock
- alarmmanager唤醒装置(你是绝对正确的,黄),但活动不能得到焦点。所以我必须定义一个新的生产线(Android 2.0的或更高版本支持这些标志:
getWindow()addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
|窗口管理器。 LayoutParams.FLAG_TURN_SCREEN_ON)
;
- alarmmanager works well. However, it does not on the screen, so I have to use wakelock
- alarmmanager wakes the device (you are absolutly right, huang), but the activity can not get focus. So I have to define a new line (Android 2.0 or above supports these flags:
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
|WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON)
;
在总结code是如下。
The summarized code is below.
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();
这篇关于AlarmManager和WakeLock的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!