我使用的是JellyBean,而不是KitKat或更高版本的API,因此应在正确的时间调用onReceive方法。 问题是大多数时候我的电话都被唤醒,但有时却没有(我查看了保存日志的时间)。

这就是我创建待定意图的方法:

    PendingIntent pendingIntent;
    AlarmManager manager;

    Intent alarmIntent = new Intent(this, AlarmReceiver.class);

    pendingIntent = PendingIntent.getBroadcast(this, idSms, alarmIntent, 0);

    manager.set(AlarmManager.RTC_WAKEUP, time, pendingIntent);

现在是BroadcastReceiver

public class AlarmReceiver extends BroadcastReceiver {

    private static final String TAG = "AlarmReceiver";

    @Override
    public void onReceive(Context arg0, Intent arg1) {  
        Log.d(TAG, "onReceive()");
    }
}

就是这样了。 正如我在大部分时间里写的那样, BroadcastReceiver是在清单中声明的​​,但是有时我不得不自己打开手机以查看日志...我读了几个主题,却找不到答案,为什么会发生。 我也知道WakeLocker ,我在日志之后尝试这样做,但是我认为onReceive甚至没有被调用,至少日志有时没有显示出来。

希望提供一些建议或解释为什么它一直都不起作用。 谢谢

编辑1:我添加了一些代码,当手机处于休眠状态时仍然无法使用:

public void onReceive(Context arg0, Intent arg1) {  
PowerManager pm = (PowerManager) arg0.getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "WakeLock");
wl.acquire();   
Log.d(TAG, "onReceive()");
wl.release();
}

编辑2:更改代码:

public class AlarmReceiver extends WakefulBroadcastReceiver {

    private static final String TAG = "AlarmWakefulReceiver";

    @Override
    public void onReceive(Context arg0, Intent arg1) {
        Log.d(TAG, "onReceive()");
        Intent service = new Intent(arg0, SmsService.class);
        Log.d(TAG, "Creating service");
        startWakefulService(arg0, service);
    }
}


public class SmsService extends IntentService {
    private static final String TAG = "IntentService";

    public SmsService() {
        super("SmsService");
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        Toast.makeText(this, "Service completed", Toast.LENGTH_SHORT).show();
        Log.i(TAG, "Completed service");
        AlarmReceiver.completeWakefulIntent(intent);
    }

}

服务已注册并正常工作,我将时间设置为8:47,在8:49检查了电话,并在该时间获取onReceive()。 日志:

01-15 08:49:04.894: D/AlarmWakefulReceiver(32576): onReceive()
01-15 08:49:04.894: D/AlarmWakefulReceiver(32576): Creating service
01-15 08:49:04.914: I/IntentService(32576): Completed service

编辑3:我在手机上对此进行了测试: http : //wptrafficanalyzer.in/blog/setting-up-alarm-using-alarmmanager-and-waking-screen-and-unlocking-keypad-on-alarm-goes-断功能于机器人/

我的手机是Xperia L,系统4.2.2

#1楼 票数:1 已采纳

http://commonsware.com/blog/2013/03/08/warning-xperia-z-stamina-alarmmanager.html

我有Xperia L并检查了此链接...好吧...我的Xperia具有耐力模式。 似乎Stamina有时会阻止我的唤醒功能。

为了解决这个问题,您需要进入电源管理选项,进入耐力模式并将其关闭,或者将我们的应用程序设置为例外。 到目前为止效果很好,我将进行更多测试,并确定是否存在问题!

编辑1:

10:04-我将警报设置为10:21触发,并在10:28检查了效果,可以了!

日志:

01-15 10:21:16.804: D/AlarmWakefulReceiver(11202): onReceive()
01-15 10:21:16.814: D/AlarmWakefulReceiver(11202): Creating service
01-15 10:21:16.834: I/IntentService(11202): Completed service

  ask by Janusz Hain translate from so

未解决问题?本站智能推荐:

1回复

使用AlarmManager时出现混淆,意图在更新小部件时

我是Android开发和Java的新手,正在尝试使用AlarmManager更新我的窗口小部件,但是我无法完全理解为什么大多数教程都不以以下方式更新窗口小部件。 我正在使用textview在我的小部件中显示一个数字,每秒增加一次,并在删除小部件时将其递减10,而在删除所有小部件时将其重置为0。
1回复

AlarmManager-设置为10分钟时不会关闭

基本上,此代码的工作方式是...它从初始计算开始,然后在X分钟后通过Alarmmanager启动服务,该服务获得结束计算并确定两者之间的差。 在每个警报结束时,将在相同的时间间隔内设置一个新警报。 当我将时间间隔设置为10分钟时,警报根本不会响起。 我假设这与手机CPU进入休眠状态有关
1回复

关于AlarmManager行为的说明

我具有此静态帮助器功能,以设置每日重复警报: 我在三个地方调用了此辅助函数: 设备启动时,我想重新注册警报: 在我的一项活动中,将其称为ActivityA: AlarmReciever.setAlarm(ActivityA.this, 7, 00); 在另一
1回复

AlarmManager扩大布局

我的MainActivity中有一个AlarmManager,用于检查网站并在某些条件为真时创建通知。 AlarmManger在单独的类中使用挂起的Intent>广播接收器。 然后,该广播接收器类调用第三个活动,该活动执行代码以检查网站并处理结果,所有活动均在未打开应用程序的情况下
1回复

如何同时取消和设置AlarmManager

我目前正在做的是使用AlarmManager.SetAlarm(context)启用并使用AlarmManager.CancelAlarm(context)取消它。 我将它与IntentService一起使用。 我想做的是从触发的IntentService取消警报,然后再次设置它,例如:
2回复

Android:无法取消AlarmManager

我似乎无法取消闹钟。 我看过Stack Overflow上的其他文章,但没有一个对我有用。 这是我的代码: AddAlarm类: 你们有什么建议吗? 谢谢!
2回复

如何更改AlarmManager警报?

我在我的应用程序中使用AlarmManager在适当的时间设置闹钟。 我的应用程序中有多个警报,因此每次用户保存警报时,我都会发现下次应该播放哪个警报,并将该警报的ID作为意图的附加内容传递。 这是我用于的代码: 在这里,如果有任何旧的闹钟设置然后添加新闹钟,我会取消。 所有警报都
1回复

类内的AlarmManager调用方法

我想使用AlarmManager来调用已由另一个AlarmManager定期调用的类中的特定方法。 实际上,我想使用AlarmManager而不是计时器,因为在不使用电话时,计时器的延迟将被忽略。 所以,现在不用计时器做这样的事情了... 我希望AlarmManager做类似的事情。