我管理一切都可以创建一个通知服务,用于通过警报触发通知.不幸的是,使用AlarmManager设置闹钟无法正常工作.它在几分钟后发射(不完全是几小时,这表明存在时区问题).重复周期是1周,所以我使用常量INTERVAL_DAY并将其乘以7.为了确保一个PendingIntent不替换另一个,我将dayOfWeek作为第二个参数传递给PendingIntent.getService().我通过记录来检查警报发射时间的正确性:
Log.d(TAG, "next alarm " + df.format(cal.getTime()));
Run Code Online (Sandbox Code Playgroud)
是否真的没有办法列出所有报警集 - 至少是我自己的应用程序?我相信这是追踪错误的唯一方法.
我的代码:
cal.setTimeInMillis(System.currentTimeMillis());
cal.add(Calendar.DATE, 1);
cal.set(Calendar.HOUR_OF_DAY, hour);
cal.set(Calendar.MINUTE, minute);
Log.d(TAG, "next alarm " + df.format(cal.getTime()));
Intent showNotificationIntent = new Intent(context, NotificationService.class);
dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);
alarmIntent = PendingIntent.getService(context, dayOfWeek, showNotificationIntent, 0);
getAlarmManager(context).setInexactRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(),
INTERVAL_WEEK, alarmIntent);
Run Code Online (Sandbox Code Playgroud)
我想提供每天报警,但在不同的时间,可以由用户设置.所以我最多使用7个警报,每周应该发射一次.
即使在阅读了类似问题的大量答案之后(我不打算创建一个重复的问题),我也没有设法找到问题.
有人可以为设定的重复周日警报提供良好的逻辑吗?我通过使用每周做一次警报
alarmCalendar.set(Calendar.HOUR, AlarmHrsInInt);
alarmCalendar.set(Calendar.MINUTE, AlarmMinsInInt);
alarmCalendar.set(Calendar.SECOND, 0);
alarmCalendar.set(Calendar.AM_PM, amorpm);
Long alarmTime = alarmCalendar.getTimeInMillis();
Intent intent = new Intent(Alarm.this, AlarmReciever.class);
intent.putExtra("keyValue", key);
PendingIntent pi = PendingIntent.getBroadcast(Alarm.this, key, intent, PendingIntent.FLAG_UPDATE_CURRENT);
am.setRepeating(AlarmManager.RTC_WAKEUP, alarmTime, 7*1440*60000 , pi);
Run Code Online (Sandbox Code Playgroud)
警报触发按时触发,7天后会自动触发.
但我的要求是我想选择几天而不是仅仅七天.
类似于每周一,周二,周四上午9:00 - 警报应自动触发.我如何在setRepeating中执行此操作.
有人可以帮我解决这个问题吗?
谢谢!
我们有一些重复的警报设置,它们在大多数情况下都能正常工作.有时虽然他们卡住了(可能以某种方式取消).如何调试它以确保警报实际上在看起来卡住时关闭?
关于警报被取消的原因:我知道当用户强制从Applications Manager停止您的应用程序时会发生这种情况.系统可以随机取消吗?(比如在杀死整个应用程序以回收资源时?)
从我所看到的情况来看,如果你安排一个无限期重复的警报,它将不会停止运行,直到你重启设备或卸载应用程序.
我想知道,在应用更新的情况下,这些行为如何表现?例如,您从Play商店下载该应用程序的版本1,然后运行该应用程序,此警报开始运行.然后发布版本2并执行自动或手动更新.此警报是否仍在继续运行(或者您是否必须再次启动应用程序才能启动警报)?
在我的场景中,我确实需要这样做,所以我希望答案是它会继续运行.但是,如果您在版本2中更改了警报代码,会发生什么?
Alarm Manager的参考说明了这一点
如果指定的触发时间是过去的,则会立即触发警报.
我在申请中遇到了这个问题.这是我的警报管理器代码:
Intent myIntent = new Intent(getActivity(), DinnerAlarmReceiver.class);
pendingDinnerIntent = PendingIntent.getBroadcast(getActivity(), 0, myIntent, 0);
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, hourOfDay);
calendar.set(Calendar.MINUTE, minute);
alarmManager.set(AlarmManager.RTC_WAKEUP,
calendar.getTimeInMillis(), pendingDinnerIntent);
Run Code Online (Sandbox Code Playgroud)
这个问题有解决方法吗?
- - -编辑 - - -
我写了一些代码来估计警报的设定时间是否在当前时间之前.以上部分有相应的变化:
Calendar calendar = Calendar.getInstance();
long currentTime = calendar.getTimeInMillis();
calendar.set(Calendar.HOUR_OF_DAY, hourOfDay);
calendar.set(Calendar.MINUTE, minute);
long setTime = calendar.getTimeInMillis();
Timestamp setTimestamp = new Timestamp(setTime);
Timestamp currentTimestamp = new Timestamp(currentTime);
if (setTimestamp.after(currentTimestamp))
{
alarmManager.set(AlarmManager.RTC_WAKEUP,
calendar.getTimeInMillis(), pendingDinnerIntent);
}
else
{
}
Run Code Online (Sandbox Code Playgroud)
我的应该是什么alarmManager来的情况下,setTimestamp是前currentTimestamp?
我想在每个星期一上午9:00和下午05:00重复我的任务.我使用了以下代码,但我无法重复该任务.
活动代码:
public class AndroidScheduledActivity extends Activity {
/** Called when the activity is first created. */
int id = 115;
Intent myIntent;
PendingIntent pendingIntent;
AlarmManager alarmManager;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button buttonStart = (Button)findViewById(R.id.start);
myIntent = new Intent(getBaseContext(), MyScheduledReceiver.class);
myIntent.putExtra("id", id);
pendingIntent = PendingIntent.getBroadcast(getBaseContext(), id, myIntent, 0);
alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);
buttonStart.setOnClickListener(new Button.OnClickListener(){
public void onClick(View arg0) {
// TODO Auto-generated method stub
setForMonday();
finish();
}});
}
public void setForMonday() {
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.DAY_OF_WEEK,2); …Run Code Online (Sandbox Code Playgroud) android broadcastreceiver alarmmanager android-alarms repeatingalarm
所以基本上我有这个代码,时间返回24小时,每天重复闹钟.
public setAlarm(String time, Context context){
String[] strTime;
strTime = time.split(":");
int hour, min, sec;
//set when to alarm
hour = Integer.valueOf(strTime[0]);
min = Integer.valueOf(strTime[1]);
sec = 0;
Calendar cal = Calendar.getInstance();
cal.set(Calendar.HOUR_OF_DAY, hour);
cal.set(Calendar.MINUTE, min);
cal.set(Calendar.SECOND, sec);
//Create a new PendingIntent and add it to the AlarmManager
Intent intent = new Intent(context, AlarmReceiverActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 19248, intent, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager am = (AlarmManager) context.getSystemService(Activity.ALARM_SERVICE);
am.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent);
}
Run Code Online (Sandbox Code Playgroud)
无论如何,问题是当我在上午9点10分设置闹钟时,闹钟将会响起.为什么?如果设置超过系统时间,我希望它不会报警.防爆.系统时间是上午9:10,在上午9点设置闹钟
我需要弄清楚是否重新启动该警报,因为它是一个定时的服务器轮询,但应该只有一个该警报的实例.
我正在尝试启动一个在特定时间每天重复的警报服务.我已经经历了关于堆栈溢出的很多线程,但没有运气.我按照了几个教程:http://karanbalkar.com/2013/07/tutorial-41-using-alarmmanager-and-broadcastreceiver-in-android/和http://javatechig.com/android/repeat-alarm-example -in-机器人
我的服务从未开始,我不明白为什么.以下是我的代码:
我的清单文件:
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="com.android.alarm.permission.SET_ALARM" />
<application>
<service android:name="com.paper.DownloadService" android:enabled="true"/>
<receiver android:name="com.paper.MyReceiver" ></receiver>
</application>
Run Code Online (Sandbox Code Playgroud)
我的接收器类:
public class MyReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context rcontext, Intent intent)
{
Log.e("Main Activity", "inside on receive of myreceiver");
Intent service1 = new Intent(rcontext, DownloadService.class);
rcontext.startService(service1);
}
}
Run Code Online (Sandbox Code Playgroud)
我的服务类:
public class DownloadService extends Service {
@Override
public void …Run Code Online (Sandbox Code Playgroud) android broadcastreceiver alarmmanager android-service repeatingalarm
我的应用程序为用户提供了在特定时间安排每日通知的选项。我用来AlarmManager实现这种行为。
单击按钮后,我执行以下代码:
\nval datetimeToAlarm = Calendar.getInstance(Locale.getDefault())\n /*datetimeToAlarm.set(HOUR_OF_DAY, 21)\n datetimeToAlarm.set(MINUTE, 0)\n datetimeToAlarm.set(SECOND, 0)\n datetimeToAlarm.set(MILLISECOND, 0)*/\n\n NotificationHelper.createNotificationChannel(\n requireContext(),\n NotificationManagerCompat.IMPORTANCE_DEFAULT,\n false,\n weather,\n "Daily weather notifications for ${weather.cityName}"\n )\n\n NotificationHelper.scheduleNotification(\n requireContext(),\n datetimeToAlarm,\n weather\n )\nRun Code Online (Sandbox Code Playgroud)\n出于测试目的,我还没有设置它必须触发的确切时间。
\nNotificationHelper我上面使用的类的两种方法:
fun createNotificationChannel(\n context: Context,\n importance: Int,\n showBadge: Boolean,\n data: Weather,\n description: String\n ) {\n\n if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {\n\n // Format: $placeId-$cityName\n val channelId = "${data.placeId}-${data.cityName}"\n val channel = NotificationChannel(channelId, "Weather for ${data.cityName}", importance)\n channel.description = description\n channel.setShowBadge(showBadge)\n\n val notificationManager …Run Code Online (Sandbox Code Playgroud) android alarmmanager android-notifications repeatingalarm miui