为什么警报接收器不会在android中触发?

时间:2014-06-04 06:15:32

标签: android datetime timer broadcastreceiver alarmmanager

我实现了一个简单的报警功能,用于在特定的日期时间触发某些功能。

问题是我已经设定了时间,但接收器似乎从未被调用过。

以下是我的实施方式:......

1)在清单中:

 <uses-permission android:name="com.android.alarm.permission.SET_ALARM" />

<receiver android:name=".Listener.AlarmReceiver" />

2)主要活动(我想在 2014年6月4日,下午02:06 上触发)

profilePic.setOnClickListener(new OnClickListener(){
        @Override
        public void onClick(View v) {
             GregorianCalendar date = new GregorianCalendar(2014,6,4,14,6);
             long dateTime = date.getTimeInMillis();
             Log.d("test1",date.toString());
             AlarmManager alarmManager = (AlarmManager) ctx.getSystemService(Context.ALARM_SERVICE);
             Intent intentAlarm = new Intent(ctx, AlarmReceiver.class);
             alarmManager.set(AlarmManager.RTC_WAKEUP, dateTime, PendingIntent.getBroadcast(ctx, 1, intentAlarm, PendingIntent.FLAG_UPDATE_CURRENT));
        }
    });

我也记录了时间

java.util.GregorianCalendar[time=1404453960000,areFieldsSet=true,lenient=true,zone=Asia/Hong_Kong,firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2014,MONTH=6,WEEK_OF_YEAR=27,WEEK_OF_MONTH=1,DAY_OF_MONTH=4,DAY_OF_YEAR=185,DAY_OF_WEEK=6,DAY_OF_WEEK_IN_MONTH=1,AM_PM=1,HOUR=2,HOUR_OF_DAY=14,MINUTE=6,SECOND=0,MILLISECOND=0,ZONE_OFFSET=28800000,DST_OFFSET=0]

3)接收者

public class AlarmReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d("test1", "alarm");
        Toast.makeText(context, "Alarm Triggered", Toast.LENGTH_LONG).show();
    }
}

我等到下午02:06。但什么都没发生,接收器没有被叫到。如何解决问题?此外,是否可以设置多个警报,我需要做的就是创建另一个日期时间并再次触发alarmManager.set(),它是否会覆盖旧计时器?谢谢你的帮助。

更新

对于mainifest中的AlarmReceiver,

我改为

<receiver android:name="com.example.antismoke.Listener.AlarmReceiver" />

班级是

package com.example.antismoke.Listener;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.widget.Toast;

public class AlarmReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d("test1", "alarm");
        Toast.makeText(context, "Alarm Triggered", Toast.LENGTH_LONG).show();
    }
}

所以我认为包名不是根本原因?谢谢你的帮助

5 个答案:

答案 0 :(得分:2)

尝试使用日历,而不是使用GregorianCalendar 尝试以下,它应该工作:

Intent i = new Intent(getApplicationContext(), AlarmReceiver.class); 
PendingIntent sender = PendingIntent.getBroadcast(AlarmSample.this, 0, i, 0);

Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, hour); // set hour
calendar.set(Calendar.MINUTE, minuite); // set minute
calendar.set(Calendar.SECOND, 0); // set seconds     
AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE); 
am.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), sender); 

答案 1 :(得分:1)

如果你有不同的包,你应该正确使用包名

接收器android:name =“XXX.XXXXXXXXXXXXXXX.AlarmReceiver”/&gt;

检查出来

答案 2 :(得分:1)

1)您不需要此持久性(com.android.alarm.permission.SET_ALARM)来接收警报。

2)改变这一行:

<receiver android:name=".Listener.AlarmReceiver" />

<receiver android:name=".AlarmReceiver" />

答案 3 :(得分:0)

alarmManager.set替换为alarmManager.setRepeating

或尝试使用此:

public static AlarmManager am = null;
public static PendingIntent sender;
Intent intent1 = new Intent(ctx, Reciver.class);
sender = PendingIntent.getBroadcast(ctx, 1, intent1, 0);
am = (AlarmManager) getSystemService(ALARM_SERVICE);
long l = new Date().getTime();
am.setRepeating(AlarmManager.RTC_WAKEUP, l, 1500, sender);

答案 4 :(得分:0)

好的,最后我发现这是因为GregorianCalendar中的月份从0开始。所以六月应该使用5而不是6

我应该注意到这个问题。谢谢你们所有人