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

AlarmManager(حل شد)

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

با توجه به فصل 20 آموزش ها من میخوام یک اکتیویتی رو توی زمان خاصی از روز باز کنم (هر روز) توی گوگل زیاد سرچ کردم ولی یا خیلی پیچیده بودن یا عملکرد خوبی نداشتن ، کسی با IntentFilter و BroadCastReceiver و البته AlarmManager ها کار کرده؟

نظرات

Hajhosseini 12 سال پیش
مشکل اول حل شد ، صفحه باز میشه و notification ارسال میشه و حتی ویبره هم میزنه ، ولی یک مشکل بزرگتر و سخت تر پیش اومد ، در صورتی که بخوام ساعت این عملیات رو عوض کنم که به طور مثال اگر 8 صبح هر روز بوده و بشه 10 صبح هر روز کجا باید تغییر بدم؟ توی Receiver یا توی AlarmManager ?
Spirit 12 سال پیش
توی AlarmManager
Hajhosseini 12 سال پیش
ممنون Sprit جان مشکل حل شد ، البته توی MainActivity نحوه ی ست کردن تایم رو عوض کردم
override 12 سال پیش
همین!حل شد؟!! خب پس یعنی قرار نیست بنویسید جیکار کردید؟ درسته ممکنه من چیزی سر در نیارم اگه بگید چیکار کردید ولی همه که مبتدی نیستن مبتدی ها هم همیشه مبتدی نمی مونن.
Hajhosseini 12 سال پیش
دوست عزیز وقتی نه کسی لایک کرده نه کامنت گذاشته و نه علامت ستاره رو زده برای کی توضیح بدم؟! یک نگاهی به پست بنداز ، کاملا خالی از سکنهست
javac 12 سال پیش
به نظر من یه جواب مختصری هم میدادید بهتر بود به هر حال بالاخره به درد یه نفر خواهد خورد . ممنون :)
Hajhosseini 12 سال پیش
توضیحات کامل در پاسخ اضافه شد

پاسخ‌ها 8

مشاهده پاسخ صحیح
Hajhosseini 12 سال پیش

 پاسخ صحیح

توی این برنامه چندین مرحله باید انجام بشه و برخلاف ظاهر و اسم ساده ای که داره بسیار کارهای پیچیده و وقت گیری باید انجام بشه.(2 روز برای من که مبتدی هستم طول کشید)
ابتدا باید در Manifest تنظیمات زیر رو اعمال کنیم:

 <uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.VIBRATE"/>

<service android:name=".MyAlarmService"
android:enabled="true" />
<receiver android:name=".MyReceiver"
android:enabled="true">

<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>

کد های بالا Permision های WAKE_LOCK و VIBRATE رو به ما میده و یک سرویس تعریف میکنه که فعالیت داشته باشه (حتی در هنگامی که برنامه باز نیست ) و Receiver و Intent Filter هم همان فضول و مسئله ای که اون فضول بهش توجه داره اند

نظرات

Hajhosseini 12 سال پیش

در مرحله بعدی در اکتیویتی MainActivity باید زمان رو بگیریم و یک Calendar ست کنیم که بتوانیم با استفاده از اون سرویس خود را زمان بندی کنیم.

 private PendingIntent pendingIntent;
private Calendar calendar;

public int setHours = 18;
public int setMinutes = 26;
public int setSeconds = 0;

final EditText hours = (EditText) findViewById(R.id.hours);
final EditText minutes = (EditText) findViewById(R.id.minutes);
final EditText seconds = (EditText) findViewById(R.id.seconds);

Button btnSet = (Button) findViewById(R.id.btnSet);
btnSet.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View arg0) {
Toast.makeText(getApplicationContext(), "TIME CHANGED", Toast.LENGTH_LONG).show();
Log.i("TAG", "TIME CHANGED");

setHours = Integer.parseInt(hours.getText().toString());
setMinutes = Integer.parseInt(minutes.getText().toString());
setSeconds = Integer.parseInt(seconds.getText().toString());

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));

calendar.set(Calendar.HOUR_OF_DAY, setHours);
calendar.set(Calendar.MINUTE, setMinutes);
calendar.set(Calendar.SECOND, setSeconds);
calendar.set(Calendar.AM_PM, Calendar.PM);

Intent myIntent = new Intent(MainActivity.this, MyReceiver.class);
pendingIntent = PendingIntent.getBroadcast(MainActivity.this, 0, myIntent, 0);

AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
alarmManager.set(AlarmManager.RTC, calendar.getTimeInMillis(), pendingIntent);

}
});

در بالا من 3 تا EditText برای گرفتن زمان در نظر گرفتم و البته یک دکمه که عملیات رو در نظر میگیره ، و Date رو از خود دستگاه تاریخ روز جاری رو میگیرم.بعد از ست کردن Calendar کلاس MyReceiver رو صدا میزنم که در اون کلاس کد زیر نوشته شده

نظرات

Hajhosseini 12 سال پیش

 public class MyReceiver extends BroadcastReceiver
{

@Override
public void onReceive(Context context, Intent intent)
{
Vibrator vibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
vibrator.vibrate(1000);

Intent service1 = new Intent(context, MyAlarmService.class);
context.startService(service1);

}
}

که البته من Vibrator رو برای تست اینجا انجام دادم ، و بدون اون کاملا صحیح کار میکنه ...
پس از این کلاس ، کلاس MyAlarmService رو مینویسیم ، در این کلاس تمامی عملیاتی که با اجرا شدن سرویس ما توسط IntentFilter انجام میشه رو مینویسیم ، من توی برنامم نوتیفیکیشن دادم ، صدای Default Notification رو اضافه کردم ، و البته Notification bar رو لینک دادم به فرم جدید

 public class MyAlarmService extends Service
{
private NotificationManager mManager;

@Override
public IBinder onBind(Intent arg0)
{
return null;
}

@Override
public void onCreate()
{
super.onCreate();
}

@SuppressWarnings("static-access")
@Override
public void onStart(Intent intent, int startId)
{
super.onStart(intent, startId);

mManager = (NotificationManager) this.getApplicationContext().getSystemService(this.getApplicationContext().NOTIFICATION_SERVICE);
Intent intent1 = new Intent(this.getApplicationContext(), NextActivity.class);

Notification notification = new Notification(R.drawable.ic_launcher, "message!", System.currentTimeMillis());
intent1.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);

PendingIntent pendingNotificationIntent = PendingIntent.getActivity(this.getApplicationContext(), 0, intent1, PendingIntent.FLAG_UPDATE_CURRENT);
notification.flags |= Notification.FLAG_AUTO_CANCEL;
notification.setLatestEventInfo(this.getApplicationContext(), "AlarmManagerDemo", "This a test message!", pendingNotificationIntent);

Toast.makeText(this, "salaaaaaaaaaaaaaam", Toast.LENGTH_LONG).show();

MakeSomeSound();
mManager.notify(0, notification);
}


public void MakeSomeSound() {
try {
Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
Ringtone r = RingtoneManager.getRingtone(getApplicationContext(), notification);
r.play();
}
catch (Exception e) {
e.printStackTrace();
}
}


@Override
public void onDestroy()
{
// TODO Auto-generated method stub
super.onDestroy();
}

}

نظرات

Hajhosseini 12 سال پیش
کد های این کلاس هم فکر کنم کاملا واضح بود ، بازم اگر کسی سوالی داشت در خدمتم
Spirit 12 سال پیش
زحمت کشیدی ، حتما به برای دوستانی مفید واقع میشه :)
hamidd 12 سال پیش
آفرین.دستتون درد نکنه هم جواباتون رو like کردم هم پروفایلتون رو :)
Hajhosseini 12 سال پیش
لطف دارید دوستان
override 12 سال پیش
دیدید اگه توضیح بدید همه هم لایک میکنند هم ستاره رو میزنند، دستتون دردنکنه - خسته نباشید . ممنون
Hajhosseini 12 سال پیش
چرا من نمیتونم نظر های دوستان رو ببینم ؟! فقط برام Notification میاد!!!
amirfallahi 11 سال پیش
سلام علی جان. نظر من رو میبینی الان؟ :D آقا دیدم نوشتی زمان خاصی از روز ( هر روز ) خواستم بپرسم. با این کد ها هر روز آلارم میده تو اون ساعت؟ ( من میخوام نوتیفیکیشن استفاده کنم و داخل نرم افزار هم از دیالوگ استفاده کنم ) بعد ممکنه دوتا آلارم یا بیشتر تو اون ساعت ست بشه. با هم تداخل نمیکنن؟ واسه حذف کردنشونم میتونی یه راهنمایی بکنی ؟ ( مخصوصا اگه از دوتا بیشتر باشن اگه حذف بخواد بشه همرو حذف میکنه دیگه... ) ممنون میشم یه توضیحی بدی ( با اینکه ۷ ماه گذشته از این کار)
amirfallahi 11 سال پیش
:( من گیج شدم :| مگه BroadcastReceiver مال وقتی نیست که گوشی روشن میشه اجرا بشه؟ یعنی هر وقت گوشی روشن بشه این کاری که تعیین کردی یعنی ارسال به اکتیویتی نوتیفیکیشنت انجام میشه؟ پس نقش آلارم منیجیر چیه اینجا؟ اگه گوشی خاموش شه که آلارم از بین میره. نمیره؟ یه توضیحم درمورد این بده بی زحمت. من الان طبق آموزش استاد آلارم منیجیرمو داخل کلاس مشتق گرفته از BroadcastReceiverم بنویسم بعد جایی که میخوام آلارم منیجیرو ست کنم این کلاسو صدا بزنم کافیه؟ یا دو بار باید این کارو انجام بدم؟ یا براش یه کلاس دیگه بنویسم و هم تو BroadcastReceiver هم تو جایی که میخوام استفاده کنم اون کلاس جدید و صدا بزنم؟
CodeMaster 11 سال پیش
BroadCatReceiver به هر چیزی که توی منیفست براش تعیین کنید گوش میده که میتونه خاموش و روشن شدن گوشی هم جزوش باشه توی گوگل جستجو کنید android broadcast receiver actions براتون لیستشون بهمراه کاربردشون میاد. در مورد آلارم منیجر هم می تونید از آرایه استفاده کنید میتونید یک کلاش شبیه StuctNote که استاد توی فصل لیست ویو درست کردند استفاده کنید، همچنین استفاده از SharedPreferences هم گزینه خوبی میتونه باشه
Amin 11 سال پیش
کلاس NextActivity چه کار میکنه؟!
Hajhosseini 11 سال پیش
M.A.ahmadi زمانی که بر روی notification کلیک میکنید این کلاس اجرا میشه.
ahm_android 10 سال پیش
آقای حاج حسینی خیلی زحمت کشیدی.منم خیلی دنبال AlarmManager بودم با استفاده از BroadcastReceiver. ممنون از زحمات شما دوست عزیز. خداییش من ویدئوی آلارم منیجر رو دیدم متأسفانه تا درگیرش نشی پی نمیبری که چقد استاد میتونست کاربردی تر تدریس کنه. دیگه کاریش نمیشه کرد. در آخر یه بار دیگه از شما دوست مهربان بابت آموزش خوب و کاملتون تشکر و قدردانی میکنم. موفق باشی.
Hajhosseini 10 سال پیش
لطف دارید دوست عزیز. البته این آموزش قبل از آموزش آلارم منیجر استاد قرار داده شده و یکسری قسمت هاش منسوخ شده. مثلا شما باید از setExact یا متدهایی مانند این استفاده کنید که در اندروید +5 آلارمتون دقیق ست بشه.
Hajhosseini 11 سال پیش

امیر جان زمانی که آلارم منیجر رو ست میکنیم، گوشی در زمان تعیین شده یک کلاس رو اجرا میکنه، وقتی گوشی شما خاموش و روشن میشه این آلارم ها حذف میشه، پس شما نیاز به عملگری داری که این آلارم هارو دوباره ست کنه. از BroadCastReceiver زمانی استفاده میکنیم که گوشی خاموش و روشن میشه، کارش اینه که دوباره آلارم منیجر رو ست کنه. حالا اگر بخواید چند آلارم ست کنید کافیه به PendingIntent یک ID اختصاص بدید، این آیدی ها رو همونطوری که حسین عزیز گفتن میتونید در یک آرایه از SharedPreferences ها ذخیره کنید، میتونید هم از دیتابیس استفاده کنید. زمانی که میخواید یک آلارم رو کنسل کنید، باید آیدی اون رو پیدا کنید و کنسلش کنید. حتما تست کنید که با خاموش و روشن شدن دستگاه دوباره فعال نشه.

نظرات

amirfallahi 11 سال پیش
آهان این پست رو ندیده بودم. اسمشو عوض کردی آخه . الان اگه طبق همین کد های شما بنویسم و pendingIntent رو بجای getActivity براش از getBroadcast استفاده کنم و Intent هم به یه کلاس مشتق شده از BroadCastReceiver اشاره کنه که داخلش منتقل میشیم به یه کلاس سرویس که نوتیفیکیشن میده دقیقا وقتی گوشی خاموش و روشن بشه کلاس سرویس رو اجرا میکنه یا وقتی به تایم آلارم منیجیر برسه؟ من اینو نفهمیدم ببین درست میگم : یه کلاس تعریف میکنم که آلارم منیجیرامو بتونه ست کنه و کنسل کنه و براش یه ورودی استرینگ تعریف میکنم ( که میشه همون موضوع آلارم ) بعد از طریق این ورودی از دیتابیس ID مورد نظر رو میخونم و بر اساس اون یه PendingIntent میسازم و زمان های ذخیره شده داخل یه جدول دیگه رو هم از طریق همون ورودی استرینگ بدست میارم و داخل یه حلقه برای همشون آلارم ست میکنم. برای حذف هم که فقط به همون اسم ورودی نیاز دارم و ID که ازش بدست میاد. بعد من این کلاس رو توی کلاسی که BroadCastReceiver بود صدا میزنم . و در نهایت جایی که میخوام آلارم ست بشه ( یعنی بعد از ذخیره کردن اطلاعات داخل سرور ) این کلاس BroadCastReceiver رو صدا میزنم. که هر وقت گوشی خاموش و روشن شد هم صدا زده بشه. ( بعد اینجوری اون ورودی استرینگو از کجا میخوام بگیرم نمیدونم :| ) اصن گیج شدم ............. یا اگه برای کلاس BroadCastReceiver تعیین کنم که برای همه ی IDهای ذخیره شده آلارم ست کنه. ولی اینجوری هربار که کلاسش رو صدا میزنم آلارم روی آلارم قبلی ( تکراری ) ثبت میشه. نه؟ اصن این پرچم (PendingIntent.FLAG_UPDATE_CURRENT) چیه؟. نوشته آپدیت یعنی هربار آلارمی بخواد رو این pendingIntent ست بشه آپدیت میکنه؟ جدید نمیسازه؟ اگه اینجوری باشه پس همون کاری که گفتم میشه انجام داد. درسته؟ یعنی بگیم برا همه IDها آلارم ست بشه. ( اینجوری اگه مثلا ۱۰۰ تا ID باشه کند نمیشه برنامه؟) ببخشید اینهمه سوال میپرسم . دلیلش اینه که حساسم رو ورودی های مغزم ... اگه کامل نباشه اعصابم خرد میشه :(
Hajhosseini 11 سال پیش

ببین امیر جان، داری یک مساله خیلی راحت رو برای خودت سخت میکنی.
1-شما یک کلاس بساز که کارش ست کردن و حذف آلارم ها باشه.
2-یک کلاس Receiver بساز که زمانی که گوشی خاموش و روشن میشه کال بشه.

وظیفه کلاس اول(1) کاملا مشخصه، فقط آیدی هر آلارمی که ست میکنی رو در دیتابیس ذخیره کن.
وظیفه کلاس دوم(2) اینه که زمانی که گوشی دوباره روشن میشه، آلارم هایی که در دیتابیس هست رو دوباره ست کنه.
دلیل: آلارم هایی که ست میشن، با خاموش و روشن کردن گوشی از بین میرن، پس شما باید در هنگام راه اندازی مجدد گوشی دوباره آلارم ها رو ست کنی. در کلاس دوم شما باید یک حلقه داشته باشی، که به تعداد آلارم هایی که در دیتابیس ذخیره کردی آلارم ست کنه.

نظرات

amirfallahi 11 سال پیش
راست میگی خیلی سختش کرده بودم. الان که انجامش دادم دیدم اونقدرام که من پیچیدش کرده بودم نبود. آلارم ها با موفقیت ست میشن. حذف کردنشونم که کاری نداره ( هنوز انجام ندادم ولی ) . کلاس Recever هم کاری نداره مینویسمش. الان مشکل من توی اجرای کلاس مشتق شده از سرویس که توش نوتیفیکیشن تعریف میکنمه. توی تاپیک خودم کد ها رو میذارم یه نگاهی بی زحمت بنداز.
Amin 11 سال پیش

برنامه من تا set شدن آلارم درست کار میکنه  اما داخل کلاس MyReceiver برای اجرا کردن سرویس نمیره!

Intent myIntent = new Intent(MainActivity.this, MyReceiver.class);
      pendingIntent = PendingIntent.getBroadcast(MainActivity.this, 0, myIntent, 0);

      AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
      alarmManager.set(AlarmManager.RTC, calendar.getTimeInMillis(), pendingIntent);

چه مشکلی میتونه داشته باشه؟؟

نظرات

f-Dehghan 11 سال پیش
Permision آلارم رو در منیفست دادید؟
f-Dehghan 11 سال پیش
Permision آلارم رو در منیفست دادید؟
f-Dehghan 11 سال پیش
Permision آلارم رو در منیفست دادید؟
Amin 11 سال پیش
بله دادم
Hajhosseini 11 سال پیش
فقط زمانی که گوشی خاموش و روشن بشه MyReceiver اجرا میشه. باید permission ها و سروسیتون رو در manifest چک کنید. در صورتی که همه اینها درست هست لطفا کدتون رو قرار بدید تا کمکتون کنیم.
Amin 11 سال پیش
لینک کدم رو در اینجا گذاشتم.ممنون میشم راهنماییم کنید
f-Dehghan 11 سال پیش

اینو امتحان کنید ببینید جواب میده ....

  Intent myIntent = new Intent(context, MyService.class);
PendingIntent pendingIntent = PendingIntent.getService(context, 0, myIntent, 0);

AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
alarmManager.set(AlarmManager.RTC, calendar.getTimeInMillis(), pendingIntent);
}

نظرات

Amin 11 سال پیش
نه :( تاثیری نداشت!
f-Dehghan 11 سال پیش

پرمیشن اینه:

<uses-permission android:name="com.android.alarm.permission.SET_ALARM" />

سرویستون رو هم توی منیفست تعریف کردید؟

نظرات


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