آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

آلارم بعضی از وقت ها دیگر کار نمی کند

مصطفی   10 سال پیش  10 سال پیش
0 0

سلام. من یه برنامه دارم که در اون یه آلارم درست کرده ام که صبح روز بعد ساعت 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 است

اگه میشه کمکم کنید. خیلی گیر هستم

0 0
کسی تا حالا به این مشکل بر نخورده؟ (10 سال پیش)
0 0
ببینید روش این اقا چطور است. لینک (10 سال پیش)
0 0
خب من روش این آقا رو دیدم ولی خب من که بهتر از اون کار کرده ام، چ.ن اون اومده اول یه broadcast receiver رو صدا زده و بعد توی اون یه سرویس رو راه اندازی کرده ولی من مستقیما یه سرویس رو راه اندازی کرده ام. ولی خب این نمی تونه جواب سوال من باشه چون بعضی از وقتا این کد اشکال پیدا می کنه و نمی دونم چرا (10 سال پیش)
0 0
کسی نیست یه راهنمایی بده من واقعا عجله دارم. من همه جای کدم رو با ویدیو استاد تطابق داده ام ولی نمی دونم چرا آلارمم از کار میوفته؟ استاد اگه میشه خودتون کمک کنید. (10 سال پیش)
0 0
جوابگو اینجا ها نیست ؟ تو رو به خدا جواب بدین (10 سال پیش)
0 0
اگه هست برای منو هم جواب بده این دیتابیس من چرا ایجاد نمیشه؟ (10 سال پیش)
0 0
خدایی توی این انجمن یکی نیست جواب سوال منو بده؟ (10 سال پیش)
0 0
در صورتی که برنامه رو آپدیت کردی، باید اول چک کنی ببینی اون آلارم قبلی وجود داره یا نه، اگر داشت که حذفش کنی، اگر نداشت فقط بسازیش. مشکل خاصی توی کد نمیبینم، باید دیباگ کنید و ببینید کجا مشکل پیش میاد، بدون دیباگ نمیشه درست تشخیص داد کجا باگ دارید. توی onReceive بهتره از Switch استفاده بشه. بعد شما باید setTime و setAlarm رو یک جا بنویسی و هم توی برنامه و هم توی BroadCastReceiver کال کنی نه اینکه 2 بار بنویسیشون.پرمیشن setAlarm رو هم اگر ننوشتید اضافه کنید. (10 سال پیش)
0 0
با استفاده از sharedPreferences فقط در برنامه یک بار آلارم رو صدا میزنم و همچنین نوشتن واژه else if کار همون switch رو انجام میده ولی من نمی دونم آخه چرا بعضی وقت ها این برنامه درست کار نمی کنه؟ توی تبلت خودم عین ساعت کار میکنه ولی توی دیوایس های کاربر ها اینطور نیست!! به نظرتون باید چیکار کنم تا مشکلش رو پیدا کنم؟ (10 سال پیش)
 برای این سوال پاسخی وجود ندارد.

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