سِت , غیر فعال و حذف کردن AlarmManager برای چندین زمان ( حل شد )
سلام دوستان. من برای ست کردن آلارم برای زمان های مختلف مشکل دارم.
اول اینکه شاید هر یک ساعت آلارم لازم بشه. شاید هر دو ساعت و.... الی آخر ( تا هر ۱۲ ساعت )
دوم اینکه شاید برای موضوعات مختلف چندین آلارم با زمان های یکسان داشته باشیم .
برای ست کردن آلارم بصورت داینامیک میخوام توی کلاس G بنویسمش و طبق اصولش از طریق برادکست رسیور آلارم رو برای ساعت های دلخواهم ست کنم.
مشکل اولم اینه که نمیدونم باید طبق زمان هایی که بدست آوردم یکی یکی آلارم ست کنم ( مثلا از ساعت ۲ تا ۹ یک ساعت درمیون ) یا به آلارمم بگم هر دو ساعت تکرار شه ( که اینجوری باز نمیدونم چجوری بهش بگم فقط تا ۹ )
مشکل دومم اینه که نمیدونم حالا که آلارم ها ست شدن ( مثلا برا ساعت ۲ سه تا آلارم با سه تا موضوع مختلف ست شده که باید به کاربر تو اون ساعت یه نوتیفیکیشن نشون بدن هرکدومشون ) چجوری مثلا یکیشونو حذف کنم یا غیر فعال کنم. چون تا اونجایی که تو انجمن سرچ کردم همه از این کد استفاده کرده بودن :
Intent intent =newIntent(this,AlarmReceive.class);
PendingIntent sender =PendingIntent.getBroadcast(this,0, intent,0);
AlarmManager alarmManager =(AlarmManager) getSystemService(ALARM_SERVICE);
alarmManager.cancel(sender);
که اگه اشتباه نکنم این تموم آلارمایی که من ست کردم رو نابود میکنه با خاک یکسان میکنه ( چون همشونو از طریق همین اینتنت ست کردم دیگه ... )
اگه امکانش باشه که برای هر آلار یه موضوع یا کلید یا id تعریف کرد و وقتی بخوایم حذف کنیم طبق اون کلید یا id آلارم رو حذف کنیم دیگه مشکل حل میشه. درسته ؟
دوستان خواهش میکنم زودتر جواب بدید اگر میدونید. من تا ۲۹ بهمن بیشتر وقت ندارم ... :(
برای مشکل اولتون به نظرم بهتره که همون یکی یکی آلارم ها رو ست کنید
برای مشکل دومتون اگه منظورتون اینه که آلارم رو سر یک تایم مشخصی منقرض کنید از این روش میتونید استفاده کنید:
if (System.currentTimeMillis() - 60*60*1000 > alarmTime){
G.alarmManager.cancel(pendingIntent);
}
در واقع تو کد اومدیم گفتیم که اگه تایم حال حاضر سیستم - 1 ساعت بزرگتر از زمان ست شده برای آلارم بود آلارم مورد نظر رو حذف کن و همچنین اگه آلارم هاتون رو به همون روشی که استاد گفتند توی BroadCastReceiver بزارید هیچوقت با خاک یکسان نمیشن! مگه اینکه کدتون اونو بترکونه
همچنین برای آلارم نمیشه id تعریف کرد. کلا به نظرم بخش آلارم منیجر خیلی توسط توسعه دهندگان اندروید ناقص توسعه داده شده و کلی دردسر داره
امیر جان باید برای pendingIntent یک ID تعریف کنی و اون رو فعال و غیر فعال کنی.شما همه ی آیدی هارو 0 دادی و زمانی که میخوای یکی رو غیر فعال کنی همه غیر فعال میشن چون 0 اند.
برای سوال اولت هم بسته به نوع استفادت باید تصمیم بگیری، اگر میخوای مثلا 10 تا آلارم ست کنی باید 10 بار آلارم منیجر رو کال کنی، اگر میخوای بازه زمانی بدی که نوتیفیکیشن فرستاده بشه باید یک آلارم منیجر با Repeat ست کنید، اگر هم میخوای تا زمانی که آلارم valid بود تکرار شه میتونی همون آلارمی که اجرا شده رو تایمش رو تمدید کنی.
من آلارم ها رو تونستم با این کد ست کنم و جواب هم میده:
public static void setalarm(String username , String pillname){
Calendar calendar = Calendar.getInstance();
Calendar c = Calendar.getInstance();
calendar.set(Calendar.MONTH, c.get(Calendar.MONTH));
calendar.set(Calendar.YEAR, c.get(Calendar.YEAR));
calendar.set(Calendar.DAY_OF_MONTH, c.get(Calendar.DAY_OF_MONTH));
int pID = getid(username , pillname);
if(pID != -1){
Intent myIntent =new Intent(G.context ,ServiceAlarm.class);
// Intent myIntent =new Intent(G.context ,ActivityAddPills.class);
PendingIntent pendingIntent = PendingIntent.getService(G.context, pID , myIntent, PendingIntent.FLAG_UPDATE_CURRENT);
// PendingIntent pendingIntent = PendingIntent.getActivity(G.context, pID , myIntent, PendingIntent.FLAG_UPDATE_CURRENT);
Cursor times = G.remindersdatabase.rawQuery("SELECT * FROM reminders WHERE reminders_pillname = '"+pillname+"' " , null);
if(times != null) {
try {
if (times.getCount() > 0) {
for (int i = 0; i < times.getCount(); i++) {
times.moveToNext();
String User = times.getString(times.getColumnIndex("reminders_username"));
if(username.equals(User)){
int setHours = times.getInt(times.getColumnIndex("reminders_hour"));
int setMinutes = times.getInt(times.getColumnIndex("reminders_minute"));
calendar.set(Calendar.HOUR_OF_DAY, setHours);
calendar.set(Calendar.MINUTE, setMinutes);
calendar.set(Calendar.SECOND, 00);
calendar.set(Calendar.AM_PM, Calendar.PM);
G.alarmManager.setRepeating(android.app.AlarmManager.RTC_WAKEUP ,
calendar.getTimeInMillis() , android.app.AlarmManager.INTERVAL_DAY , pendingIntent);
}
}
}
} finally {
times.close();
}
}
}
}
همون طور که مشخصه یه کلاس به شکل زیر دارم:
public class ServiceAlarm extends IntentService {
public ServiceAlarm(){
super("ServiceAlarm");
// TODO Auto-generated constructor stub
}
@Override
public void onCreate() {
super.onCreate();
Intent mainIntent = new Intent(this, ActivityShowInfo.class);
NotificationManager notificationManager
= (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);
android.app.Notification noti = new NotificationCompat.Builder(this)
.setAutoCancel(true)
.setContentIntent(PendingIntent.getActivity(this, 0, mainIntent,
PendingIntent.FLAG_UPDATE_CURRENT))
.setContentTitle("Title")
.setContentText("It's been so Long!!!")
.setSubText("Please return back to App")
.setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION))
.setVibrate(new long[] {1000,1000,1000,1000})
.setSmallIcon(R.drawable.ic_launcher)
.setTicker("Important Notification")
.setWhen(System.currentTimeMillis())
.build();
notificationManager.notify(0, noti);
}
@Override
protected void onHandleIntent(Intent intent){
Toast.makeText(getApplicationContext() , "alarm" , Toast.LENGTH_LONG).show();
}
}
متاسفانه نه توست کار میکنه نه نوتیف. توست رو برای تست گذاشتم.
خب مشکل حل شد.
اول اینکه کلاس بالا رو از :
publicclassServiceAlarmextendsIntentService
به:
public class ServiceAlarm extends Service
و متد onHandleIntent که بی مصرف بود رو باید حذف میکردم و بجاش متد زیر رو میذاشتم که کلاس کامل بشه:
@Override
public IBinder onBind(Intent intent) {
return null;
}
بعدش هم این کد رو به منیفست اضافه کردم ( که اصل مشکل هم همین بود ):
<service android:name=".ServiceAlarm"
android:enabled="true" />
حالا یه سوال دیگه دارم دوستان. راهی هست که مطمئن باشیم برناممون توی همه ورژنا نوتیفیکیشن دلخواهمون رو اجرا میکنه؟
کد های نوتیفیکیشن بالا که نوشتم ظاهرا فقط برای api 11 به بالا کار میکنه. درسته؟
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .