بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]
پرسش و پاسخ

کار نکردن آلارم منیجر برای زمان های بزرگ

مدیریت گفتگو
mortex 10 سال پیش
آخرین تغییر: 10 سال پیش

سلام من دارم از آلارم منیجیر برای انجام یک کار در دوره زمانی مشخص (روزانه، هفتگی و ماهانه استفاده می کنم)

وقتی با استفاده از کد زیر برای زمانهای کوتاه مثل 1 دقیقه، 5 دقیقه و ... آلارم منیجر رو ست می کنم مشکلی نیست و در زمان مقرر کارم انجام میشه اما وقتی برای یک روز یا یک هفته ست می کنم کار نمی کنه لطفا راهنماییم کنید

AlarmManager am =( AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent i = new Intent(context, Alarm.class);
PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0); 
am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+(24*60*60*1000), 24*60*60*1000, pi);

نظرات

mortex 10 سال پیش
دوستان لطفا کمکم کنید کسی در این زمینه اطلاعاتی نداره

پاسخ‌ها 2

atf 10 سال پیش

 private static void setAlarm(Context context, Calendar alarmDate, PendingIntent pIntent) {
AlarmManager alarmManager = (AlarmManager) context .getSystemService(Context.ALARM_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { alarmManager.setExact(AlarmManager.RTC_WAKEUP, alarmDate.getTimeInMillis(), pIntent);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, alarmDate.getTimeInMillis() - 15, pIntent); }
} else {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
alarmManager.setAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, alarmDate.getTimeInMillis(), pIntent); }
alarmManager.set(AlarmManager.RTC_WAKEUP, alarmDate.getTimeInMillis(), pIntent); } }

 

نظرات

mortex 10 سال پیش
atf ممنون لطفا کمی توضیح بده یعنی اگه بجای alarmDate.getTimeInMillis همون 24*60*60*1000 رو وارد کنیم روزانه عمل میکنه؟
atf 10 سال پیش
alarmDate.getTimeInMillis() - 15 بجای این هرچی دوست داشتی بذار
mortex 10 سال پیش
atf جان در کد شما پارامترهای pIntent و alarmDate باید به چه صورتی مقداردهی بشند؟
atf 10 سال پیش

این یک کلاس کامل برای آلارم هست امیدوارم مفید واقع بشه 

که میتونید نسبت به نیاز خودتون ویرایش کنید

 

public class AlarmManagerHelper extends BroadcastReceiver {

public static final String ID = "id";
public static final String TIME_HOUR = "timeHour";
public static final String TIME_MINUTE = "timeMinute";
public static final String TONE = "alarmTone";

@Override
public void onReceive(Context context, Intent intent) {
setAlarms(context);
}

public static void setAlarms(Context context) {
cancelAlarms(context);

AlarmDBHelper dbHelper = new AlarmDBHelper(context);
List<AlarmModel> alarms = dbHelper.getAlarms();

Calendar nextAlarm = null;

if (alarms != null) {
for (AlarmModel alarm : alarms) {
if (alarm.isEnabled) {
PendingIntent pIntent = createPendingIntent(context, alarm);

Calendar alarmDate = Calendar.getInstance();
alarmDate.set(Calendar.HOUR_OF_DAY, alarm.timeHour);
alarmDate.set(Calendar.MINUTE, alarm.timeMinute);
alarmDate.set(Calendar.SECOND, 0);

// don't set alarms in the past
Calendar cur = Calendar.getInstance();
while (cur.after(alarmDate)) {
alarmDate.add(Calendar.DATE, 1);
}

// only set more than 24hr in the future if a specific day
// of week is selected
// otherwise, the next closest time should be used
if (alarm.repeatWeekly) {
while (!alarm.getRepeatingDay(alarmDate
.get(Calendar.DAY_OF_WEEK) - 1)) {
alarmDate.add(Calendar.DATE, 1);
}
}

if (nextAlarm == null || nextAlarm.after(alarmDate)) {
nextAlarm = (Calendar) alarmDate.clone();
}

setAlarm(context, alarmDate, pIntent);
}
}
}

if (nextAlarm != null) {
SimpleDateFormat sdf = new SimpleDateFormat("M/d h:mm a", Locale.US);
sdf.setCalendar(nextAlarm);
Settings.System.putString(context.getContentResolver(),
Settings.System.NEXT_ALARM_FORMATTED,
sdf.format(nextAlarm.getTime()));
} else {
Settings.System.putString(context.getContentResolver(),
Settings.System.NEXT_ALARM_FORMATTED, "");
}
}

private static void setAlarm(Context context, Calendar alarmDate,
PendingIntent pIntent) {
AlarmManager alarmManager = (AlarmManager) context
.getSystemService(Context.ALARM_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
alarmManager.setExact(AlarmManager.RTC_WAKEUP,
alarmDate.getTimeInMillis(), pIntent);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP,
alarmDate.getTimeInMillis() - 15, pIntent);
}
} else {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
alarmManager.setAndAllowWhileIdle(AlarmManager.RTC_WAKEUP,
alarmDate.getTimeInMillis(), pIntent);
}
alarmManager.set(AlarmManager.RTC_WAKEUP,
alarmDate.getTimeInMillis(), pIntent);
}
}

public static void cancelAlarms(Context context) {
AlarmDBHelper dbHelper = new AlarmDBHelper(context);
List<AlarmModel> alarms = dbHelper.getAlarms();

if (alarms != null) {
for (AlarmModel alarm : alarms) {
if (alarm.isEnabled) {
PendingIntent pIntent = createPendingIntent(context, alarm);

AlarmManager alarmManager = (AlarmManager) context
.getSystemService(Context.ALARM_SERVICE);
alarmManager.cancel(pIntent);
}
}
}
}

private static PendingIntent createPendingIntent(Context context,
AlarmModel model) {
Intent intent = new Intent(context, AlarmReceiverAlarm.class);
intent.putExtra(ID, model.id);
intent.putExtra(TIME_HOUR, model.timeHour);
intent.putExtra(TIME_MINUTE, model.timeMinute);
intent.putExtra(TONE, model.alarmTone);

return PendingIntent.getBroadcast(context, (int) model.id, intent,
PendingIntent.FLAG_UPDATE_CURRENT);
}

}

 

 

نظرات

Mehran 10 سال پیش
میشه کد کلاس های AlarmDBHelper و AlarmModel رو هم بذاری؟

پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .