首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AlarmManager和WakeLock

AlarmManager和WakeLock
EN

Stack Overflow用户
提问于 2011-03-19 20:52:46
回答 3查看 11.2K关注 0票数 4

我想在我的活动中使用警报管理器。我在main activity的onPause方法中设置了一个警报,

代码语言:javascript
复制
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方法中使用了唤醒锁来防止睡眠模式的发生。

代码语言:javascript
复制
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)。如果设备未处于休眠模式,则代码运行良好。但是,如果它处于休眠模式,它会给出一个错误并停止工作。我认为解决方案很简单,我正处于代码盲区。

EN

回答 3

Stack Overflow用户

发布于 2011-03-20 01:15:50

现在,下面的代码可以完美地工作了。

  • 警报管理器运行良好。但是,它不在屏幕上,所以我不得不使用wakelock
  • alarmmanager唤醒设备(你绝对正确,黄),但活动不能获得焦点。所以我必须定义一个新的行(Android2.0或更高版本支持这些标志:WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);

| getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD

汇总的代码如下。

代码语言:javascript
复制
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();
票数 7
EN

Stack Overflow用户

发布于 2011-03-19 21:44:51

您可以使用

代码语言:javascript
复制
am.set(AlarmManager.RTC_WAKEUP, Calendar.getInstance().getTimeInMillis()+eltime*60000, sender); 

要设置闹钟,您可以在其中使用AlarmManager.RTC_WAKEUP,因此我相信即使在设备处于睡眠状态时,也会启动您想要启动的活动。也许你不需要唤醒锁。

当你使用唤醒锁时,你需要这个权限: android.permission.WAKE_LOCK。这是你们代码中的问题吗?

票数 2
EN

Stack Overflow用户

发布于 2013-07-05 04:41:03

我也面临着同样的问题,最有趣的是,它可以在三星Galaxy S duos上运行,但不能在Galaxy Nexus上运行。我的解决方案是在广播接收器onReciever()方法中创建一个静态锁。

代码语言:javascript
复制
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。

代码语言:javascript
复制
new Handler().postDelayed(new Runnable() {

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

希望这对某些人有帮助。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5362177

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档