آلارم بعضی از وقت ها دیگر کار نمی کند
سلام. من یه برنامه دارم که در اون یه آلارم درست کرده ام که صبح روز بعد ساعت 7 اولین کار خود را یعنی یک سرویس را راه اندازی می کند و هر چهار ساعت یک بار این عمل را انجام می دهد:
private void setAlarm(Context context, int hour, int minute, int second, long interval) {
long time = setTime(hour, minute, second);
Intent intent = new Intent(context, ServiceSet.class);
PendingIntent pendingIntent = PendingIntent.getService(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
G.alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, time, interval, pendingIntent);
}
private long setTime(int hour, int minute, int second) {
Calendar calendar = Calendar.getInstance();
if (calendar.get(Calendar.HOUR_OF_DAY) > hour) {
calendar.set(Calendar.DAY_OF_MONTH, calendar.get(Calendar.DAY_OF_MONTH) + 1);
} else if (calendar.get(Calendar.HOUR_OF_DAY) == hour && calendar.get(Calendar.MINUTE) > minute) {
calendar.set(Calendar.DAY_OF_MONTH, calendar.get(Calendar.DAY_OF_MONTH) + 1);
} else if (calendar.get(Calendar.HOUR_OF_DAY) == hour && calendar.get(Calendar.MINUTE) == minute && calendar.get(Calendar.SECOND) > second) {
calendar.set(Calendar.DAY_OF_MONTH, calendar.get(Calendar.DAY_OF_MONTH) + 1);
}
calendar.set(Calendar.HOUR_OF_DAY, hour);
calendar.set(Calendar.MINUTE, minute);
calendar.set(Calendar.SECOND, second);
return calendar.getTimeInMillis();
}
توجه کنید که در کد بالا متد setTime وظیفه دارد تا زمان به ساعت 7 که پیش روی است منتقل کند.
در مورد سرویس باید بگویم که وقتی سرویس راه اندازی شد ، چک می کند که آیا ساعت بین 6 و 24 است. و اگر بود یک نوتیفیکیشن ارسال می کند و بعد از آن سرویس بعد از چند دقیقه از بین می رود:
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Calendar calendar = Calendar.getInstance();
int hour = calendar.get(Calendar.HOUR_OF_DAY);
if (6 < hour && hour < 24) {
startNotification();
}
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
stopService(new Intent(G.context, ServiceSet.class));
}
}, 500000);
return super.onStartCommand(intent, flags, startId);
}
من برای اینکه وقتی سیستم ریبوت شد یک آلارم به وجود بیاید، یک broadcast receiver دارم که در منیفست به صورت زیر است:
<receiver
android:name=".BootCompleteReceiver"
android:enabled="true"
android:exported="false" >
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.intent.action.QUICKBOOT_POWERON" />
</intent-filter>
</receiver
توجه کنید گه من permission های مربوط به دو اکشن را هم نوشته ام.
در خود broadcast receiver به صورت زیر کد نوشته ام:
private boolean nextDay = false;
@Override
public void onReceive(Context context, Intent intent) {
int interval = 14400000;
Calendar calendar = Calendar.getInstance();
int hourOfDay = calendar.get(Calendar.HOUR_OF_DAY);
if (hourOfDay < 7) {
setAlarm(G.context, 7, 00, 00, interval);
} else if (hourOfDay < 11) {
setAlarm(G.context, 11, 00, 00, interval);
} else if (hourOfDay < 15) {
setAlarm(G.context, 15, 00, 00, interval);
} else if (hourOfDay < 19) {
setAlarm(G.context, 19, 00, 00, interval);
} else if (hourOfDay < 23) {
setAlarm(G.context, 23, 00, 00, interval);
} else {
nextDay = true;
setAlarm(G.context, 7, 00, 00, interval);
}
}
public static AlarmManager alarmManager;
private void setAlarm(Context context, int hour, int minute, int second, long interval) {
long time = setTime(hour, minute, second);
Intent intent = new Intent(context, ServiceSet.class);
PendingIntent pendingIntent = PendingIntent.getService(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
alarmManager = (AlarmManager) G.context.getSystemService(Context.ALARM_SERVICE);
alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, time, interval, pendingIntent);
}
private long setTime(int hour, int minute, int second) {
Calendar calendar = Calendar.getInstance();
if (nextDay) {
calendar.set(Calendar.DAY_OF_MONTH, calendar.get(Calendar.DAY_OF_MONTH) + 1);
}
calendar.set(Calendar.HOUR_OF_DAY, hour);
calendar.set(Calendar.MINUTE, minute);
calendar.set(Calendar.SECOND, second);
return calendar.getTimeInMillis();
}
خب حالا وقتی من این برنامه را منتشر کردم یه مشکلی به وجود اومد و مشکل این بود که برای بعضی از کاربران فقط چند روز کار کرد که عمدتا دارای samsung بودند و همچنین که target sdk:4.0.3 است و حالا نمی دونم مشکل از کجاست!
در ضمن گوشی های سامسونگ دارای قابلیتی به نام restart است
اگه میشه کمکم کنید. خیلی گیر هستم
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .