PDA

View Full Version : سوال در مورد setrepeating



majid.ostadi
یک شنبه 02 شهریور 1393, 10:36 صبح
با سلام خدمت اساتید
من تو برنامه ام از الارم میخوام استفاده کنم. این الارم می خوام یه روز در میون یعنی روزهای فرد هر ماه الارم بزنه
حالا مشکلم اینجاس که از SetRepeating استفاده کنم و یا از set ؟
میشه راهنماییم کنین؟
کسی اگه در مورد setInexactRepeating میدونه یه توضیحی بده ممنون میشم

smemamian
یک شنبه 02 شهریور 1393, 11:59 صبح
سلام

تابع SetRepeating یک تابعی بسیار پر هزینه است که مستندات اندروید چندین بار پیشنهاد
کردند از این تابع استفاده نکنید مگر اینکه یک عملیاتی (مثل سرویسی یا Notification) حتماً
باید سرموقع صورت بگیرد. یعنی شما زمان را 12 ظهر در نظر می گیرید و حتماً باید AlarmManager
شما راس ساعت 12 فراخوانی شود.

تابع setInexactRepeating یک تابعی است بهینه تر از مورد قبل. این تابع با توجه به سیاست هایی
که تیم اندورید برای سیستم عامل اندورید در نظر گرفته، یک تابعی است که وقتی برای آن زمان در
نظر می گیرید، دقیق و راس آن زمان اجرا نمی شود، و اجرای آن با توجه به سیاست های سیستم
عامل اندروید است. یکی از این سیاست های این است که سیستم عامل چندین عمل رو در کنارهم
می گذارد و همه رو با یکدیگر به اجرا در می آورد.

بذارید با تصویر این دو مورد رو بررسی کنیم.


در نظر بگیرید شما AlarmManager رو برای ساعت 12 تنظیم کردید.


تابع SetRepeating :

راس ساعت صورت می گیرد و باتری را به صورت چشمگیری مصرف می کند :

http://www.uplooder.net/img/image/12/8e45c6031c803ddad53755bc301bb95c/1.png

تابع setInexactRepeating :

که راس ساعت صورت نمی گیرد و به همراه آن چندین عملیات سیستمی
دیگر به اصطلاح fire می شود :

http://www.uplooder.net/img/image/72/641312bbe30b6ccfa7d6714cb9296a74/2.png

majid.ostadi
یک شنبه 02 شهریور 1393, 12:41 عصر
سلام

تابع SetRepeating یک تابعی بسیار پر هزینه است که مستندات اندروید چندین بار پیشنهاد
کردند از این تابع استفاده نکنید مگر اینکه یک عملیاتی (مثل سرویسی یا Notification) حتماً
باید سرموقع صورت بگیرد. یعنی شما زمان را 12 ظهر در نظر می گیرید و حتماً باید AlarmManager
شما راس ساعت 12 فراخوانی شود.

تابع setInexactRepeating یک تابعی است بهینه تر از مورد قبل. این تابع با توجه به سیاست هایی
که تیم اندورید برای سیستم عامل اندورید در نظر گرفته، یک تابعی است که وقتی برای آن زمان در
نظر می گیرید، دقیق و راس آن زمان اجرا نمی شود، و اجرای آن با توجه به سیاست های سیستم
عامل اندروید است. یکی از این سیاست های این است که سیستم عامل چندین عمل رو در کنارهم
می گذارد و همه رو با یکدیگر به اجرا در می آورد.

بذارید با تصویر این دو مورد رو بررسی کنیم.


در نظر بگیرید شما AlarmManager رو برای ساعت 12 تنظیم کردید.


تابع SetRepeating :

راس ساعت صورت می گیرد و باتری را به صورت چشمگیری مصرف می کند :

http://www.uplooder.net/img/image/12/8e45c6031c803ddad53755bc301bb95c/1.png

تابع setInexactRepeating :

که راس ساعت صورت نمی گیرد و به همراه آن چندین عملیات سیستمی
دیگر به اصطلاح fire می شود :

http://www.uplooder.net/img/image/72/641312bbe30b6ccfa7d6714cb9296a74/2.png

ممنون از راهنماییت
اما من دقیقا همون setRepeating رو نیاز دارم
حالا اگه بخوام با همین متد روزهای فرد هرماه رو صدا بزنم و این پروسه ادامه داشته باشه، باید چیکار کنم
من از کلاس persian calander استفاده کردم و یه شرطی گذاشتم که اگه روز فرد بود الارم بزنه. اما ساعت مثلا 12 رو نمیدونم چطوری بهش اضافه کنم
مثلا می خوام روزهای فرد ماه ساعت 12 الارم فعال بشه
ممنون میشم کمکم کنی

majid.ostadi
یک شنبه 02 شهریور 1393, 12:44 عصر
سلام

تابع SetRepeating یک تابعی بسیار پر هزینه است که مستندات اندروید چندین بار پیشنهاد
کردند از این تابع استفاده نکنید مگر اینکه یک عملیاتی (مثل سرویسی یا Notification) حتماً
باید سرموقع صورت بگیرد. یعنی شما زمان را 12 ظهر در نظر می گیرید و حتماً باید AlarmManager
شما راس ساعت 12 فراخوانی شود.

تابع setInexactRepeating یک تابعی است بهینه تر از مورد قبل. این تابع با توجه به سیاست هایی
که تیم اندورید برای سیستم عامل اندورید در نظر گرفته، یک تابعی است که وقتی برای آن زمان در
نظر می گیرید، دقیق و راس آن زمان اجرا نمی شود، و اجرای آن با توجه به سیاست های سیستم
عامل اندروید است. یکی از این سیاست های این است که سیستم عامل چندین عمل رو در کنارهم
می گذارد و همه رو با یکدیگر به اجرا در می آورد.

بذارید با تصویر این دو مورد رو بررسی کنیم.


در نظر بگیرید شما AlarmManager رو برای ساعت 12 تنظیم کردید.


تابع SetRepeating :

راس ساعت صورت می گیرد و باتری را به صورت چشمگیری مصرف می کند :

http://www.uplooder.net/img/image/12/8e45c6031c803ddad53755bc301bb95c/1.png

تابع setInexactRepeating :

که راس ساعت صورت نمی گیرد و به همراه آن چندین عملیات سیستمی
دیگر به اصطلاح fire می شود :

http://www.uplooder.net/img/image/72/641312bbe30b6ccfa7d6714cb9296a74/2.png

ممنون از راهنماییت
اما من دقیقا همون setRepeating رو نیاز دارم
حالا اگه بخوام با همین متد روزهای فرد هرماه رو صدا بزنم و این پروسه ادامه داشته باشه، باید چیکار کنم
من از کلاس persian calander استفاده کردم و یه شرطی گذاشتم که اگه روز فرد بود الارم بزنه. اما ساعت مثلا 12 رو نمیدونم چطوری بهش اضافه کنم
مثلا می خوام روزهای فرد ماه ساعت 12 الارم فعال بشه و این الارم میخوام تو اون روز یه بار تکرار بشه و دوباره روز بعدی ماه که فرد باشه الازم بزنه
ممنون میشم کمکم کنی

PersianCalendar pc = new PersianCalendar();
int i = pc.day;
if(i == 1 || i == 3 || i==5);

Intent intent = new Intent(Home.this, RepeatingAlarmReceiverActivity.class);
PendingIntent pendingIntent =
PendingIntent.getActivity(Home.this, 3, intent,
PendingIntent.FLAG_CANCEL_CURRENT);
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + (5*1000),
15 * 1000, pendingIntent);

smemamian
یک شنبه 02 شهریور 1393, 17:43 عصر
بدست اوردن روزهای فرد ماه، که راس ساعت 12 یک کاری رو انجام بده،
نمیگم کاری سختی هستش ولی نیاز به آزمون خطا داره.

من یه کم راهنمایتون می کنم:

1- روز از ماه امروز رو از کلاس Calender بدست بیارید.
2- بررسی کنید ببینید فرد هست یا زوج.
* اگر فرد بود :
اختلاف زمانی الان رو نسبت به ساعت 12 ظهر بدست بیارید.
سپس چون روز بعدش زوج می شود پس شما نیاز دارید 24 رو در 2
ضرب کنید. یعنی 48، که می شود روز فرد بعدی از این ماه.

تا اینجا همه شرایط رو ایده آل در نظر گرفتم. خودتون باید بررسی کنید آیا
6 ماه اول سال هستیم یا 6 ماه دوم سال و...

نکته دیگه این هست که تنظیمات Alarm Manager شما بعد از
خاموش/روشن شدن دستگاه از بین می رود. پس شما نیازدارید
فال گوش BOOT_COMPLETED هم باشید.

majid.ostadi
یک شنبه 02 شهریور 1393, 19:41 عصر
بدست اوردن روزهای فرد ماه، که راس ساعت 12 یک کاری رو انجام بده،
نمیگم کاری سختی هستش ولی نیاز به آزمون خطا داره.

من یه کم راهنمایتون می کنم:

1- روز از ماه امروز رو از کلاس Calender بدست بیارید.
2- بررسی کنید ببینید فرد هست یا زوج.
* اگر فرد بود :
اختلاف زمانی الان رو نسبت به ساعت 12 ظهر بدست بیارید.
سپس چون روز بعدش زوج می شود پس شما نیاز دارید 24 رو در 2
ضرب کنید. یعنی 48، که می شود روز فرد بعدی از این ماه.

تا اینجا همه شرایط رو ایده آل در نظر گرفتم. خودتون باید بررسی کنید آیا
6 ماه اول سال هستیم یا 6 ماه دوم سال و...

نکته دیگه این هست که تنظیمات Alarm Manager شما بعد از
خاموش/روشن شدن دستگاه از بین می رود. پس شما نیازدارید
فال گوش BOOT_COMPLETED هم باشید.

داداش دمت گرم
خیلی راهنمایی به جا و موثری بود:تشویق::تشویق:

#root#
شنبه 22 شهریور 1393, 13:04 عصر
تابع setInexactRepeating :

که راس ساعت صورت نمی گیرد و به همراه آن چندین عملیات سیستمی
دیگر به اصطلاح fire می شود :

http://www.uplooder.net/img/image/72/641312bbe30b6ccfa7d6714cb9296a74/2.png


سلام
من اومدم این اختیار رو به کاربر دادم یکی از این دو متد رو استفاده کنه (با ذکر بهینه سازی مصرف باتری) توسط یه CheckBoxPreference ، وقتی که این گزینه تیک میخوره میام Alarm های قبلی رو کنسل میکنم و دوباره با متد setInexactRepeating آلارم خودم رو تنظیم میکنم ، مشکلی که دارم اینه مثلا اگر زمان آلارم ساعت 9 باشه ، و من این گزینه رو بین ساعت 9 تا 11 تغییر بدم همون لحظه عملیات خودش رو شروع میکنه ، مشکل از کدهای منه؟ راه حل به نظرتون چیه؟


AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, getAlarmIntent(context), 0);
alarmManager.cancel(pendingIntent);

if (isBatterySaveingMode) {
alarmManager.setInexactRepeating(AlarmManager.RTC_ WAKEUP, getAlarmTime(),
AlarmManager.INTERVAL_DAY, pendingIntent);
} else {
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, getAlarmTime(),
AlarmManager.INTERVAL_DAY, pendingIntent);
}

smemamian
شنبه 22 شهریور 1393, 13:39 عصر
سلام

همینطور که در مستندات به اون ذکر شده، این مشکل طبیعی هست:

لینک (http://developer.android.com/reference/android/app/AlarmManager.html#setRepeating%28int,%20long,%20lo ng,%20android.app.PendingIntent%29)



If the stated trigger time is in the past, the alarm will be triggered immediately...




باید با یه شرط این مشکل رو برطرف کنی. مثلاً زمان فعلی رو بگیر و اگر زمان فعلی بزرگتر از زمان تنظیم شده بود اجرا نشود.