我实现了一个简单的报警功能,用于在特定的日期时间触发某些功能。
问题是我已经设定了时间,但接收器似乎从未被调用过。
以下是我的实施方式:......
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();
}
}
所以我认为包名不是根本原因?谢谢你的帮助
答案 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
我应该注意到这个问题。谢谢你们所有人