我想在我的活动中使用警报管理器。我在main activity的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);
}namaz_vakti_activity是我的主要活动。onPause和onResume方法属于它。
我还在onResume方法中使用了唤醒锁来防止睡眠模式的发生。
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)。如果设备未处于休眠模式,则代码运行良好。但是,如果它处于休眠模式,它会给出一个错误并停止工作。我认为解决方案很简单,我正处于代码盲区。
发布于 2011-03-20 01:15:50
现在,下面的代码可以完美地工作了。
WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); | getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
汇总的代码如下。
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();发布于 2011-03-19 21:44:51
您可以使用
am.set(AlarmManager.RTC_WAKEUP, Calendar.getInstance().getTimeInMillis()+eltime*60000, sender); 要设置闹钟,您可以在其中使用AlarmManager.RTC_WAKEUP,因此我相信即使在设备处于睡眠状态时,也会启动您想要启动的活动。也许你不需要唤醒锁。
当你使用唤醒锁时,你需要这个权限: android.permission.WAKE_LOCK。这是你们代码中的问题吗?
发布于 2013-07-05 04:41:03
我也面临着同样的问题,最有趣的是,它可以在三星Galaxy S duos上运行,但不能在Galaxy Nexus上运行。我的解决方案是在广播接收器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()之前调用acquireWakeLock(),然后在启动的activity的OnCreate()方法中,我在一段时间后播放警报声,即在onPause()中,在停止警报声时,我通过调用releaseWakeLock()来结束activity并释放wakeLock。
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
playSound(getApplicationContext(), getAlarmUri());
}
}, 1000);希望这对某些人有帮助。
https://stackoverflow.com/questions/5362177
复制相似问题