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

AlarmManager(حل شد)

Hajhosseini  10 سال پیش  9 سال پیش
+33 0

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

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

 پاسخ صحیح

توی این برنامه چندین مرحله باید انجام بشه و برخلاف ظاهر و اسم ساده ای که داره بسیار کارهای پیچیده و وقت گیری باید انجام بشه.(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  10 سال پیش
+17 0

در مرحله بعدی در اکتیویتی 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  10 سال پیش
+19 0

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

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

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

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

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

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

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

برنامه من تا 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);

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

0 0
Permision آلارم رو در منیفست دادید؟ (10 سال پیش)
0 0
Permision آلارم رو در منیفست دادید؟ (10 سال پیش)
0 0
Permision آلارم رو در منیفست دادید؟ (10 سال پیش)
0 0
بله دادم (10 سال پیش)
+1 0
فقط زمانی که گوشی خاموش و روشن بشه MyReceiver اجرا میشه. باید permission ها و سروسیتون رو در manifest چک کنید. در صورتی که همه اینها درست هست لطفا کدتون رو قرار بدید تا کمکتون کنیم. (10 سال پیش)
0 0
لینک کدم رو در اینجا گذاشتم.ممنون میشم راهنماییم کنید (10 سال پیش)
پاسخ به سوال 
f-Dehghan  10 سال پیش
+1 0

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

  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);
}
0 0
نه :( تاثیری نداشت! (10 سال پیش)
0 0
(10 سال پیش)
پاسخ به سوال 
f-Dehghan  10 سال پیش
+1 0

پرمیشن اینه:

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

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


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