َAlarmManager در اندروید
مواقعی وجود دارد که می خواهیم عملی در ساعات مشخصی بطور متوالی انجام شود. برای مثال قصد داریم برنامه ای بنویسیم که در آن طی ساعاتی برنامه به url خاصی کانکت شده و اگر respons مورد نظر را دریافت کرد اقدام به عملیات معینی همچون دانلود یا نوتیفکشن کند . به همین منظور بهترین وسیله برای انجام این کار استفاده از کلاس AlarmManager است. این کلاس از سرویس های سیستمی اندروید می باشد که بطور منظم و براساس تایم دیوایس کار می کند. با توجه به آنچه گفته شد می توان از این کلاس به منظور اهداف متعدی استفاده نمود.
لازم به ذکر است علی رغم جذابیتی که در استفاده از این کلاس وجود دارد باید توجه نمود که در صورت امکان باید تا حد ممکن، از استفاده بی مورد از این کلاس خودداری کرد چراکه وجود چنین کلاس هایی در برنامه ها به معنای مصرف زیاد باتری در دیوایس خواهد بود و این همان عامل بازدارنده ای است که کاربران زیادی را ناراحت خواهد نمود.
برای فراخوانی کلاس AlarmManager از سیستم ALARM_SERVICE بصورت زیر عمل می کنیم.
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
بعد از فراخوانی کلاس AlarmManager، نوبت آن می رسد که تنظیمات مورد نظر خود را در آن اعمال کنیم بدین منظور ابتدا کلاس Calender و از زیرگروه آن getInstance را که با تاریخ و زمان فعلی در محل و منطقه ی زمانی پیش فرض مقدار دهی شده است را فراخوانی می کنیم که سینتکس آن بصورت زیر می باشد:
Calendar calender = Calendar.getInstance();
بعد از فراخوانی کلاس با استفاده از متد add زمان مورد نظر خود را تعیین می کنیم. در زمان بندی Calender هیچگونه محدودیتی وجود ندارد و برحسب نیازتان می توانید از سال تا ثانیه آن را تنظیم کنید.در مثال زیر ما آن را براساس ثانیه در نظر گرفته ایم.
Calendar calender = Calendar.getInstance();
calender .add(Calendar.SECOND,80);
بعد از تعریف زمان آن را به میلی ثانیه تبدیل کرده و آن را در متغیری دیگر با نام time ذخیره می کنیم به این صورت :
Long time = calender.getTimeInMillis();
در ادامه با استفاده از intent کلاسی را بدین منظور معرفی می کنیم که قرار است عمل خاصی در مدت زمان تعیین شده توسط آن کلاس انجام شود که در مثال زیر آن کلاس، کلاس MyReceiver است . PendingIntents یک API بسیار قدرتمند در آندروید محسوب می شود که به شما اجازه قرار دادن درخواستان را در یک برنامه دیگر فراهم می سازد ، تا بدین طریق امکان اجرای عملیاتی همچون اجرای اکتیویتی،سرویس یا ارسال یک broadcast در یک context فراهم شود .بدین منظور کدهای زیر را می نویسیم:
Intent intent = new Intent(MainActivity.this, MyReceiver.class);
PendingIntent pintent = PendingIntent.getBroadcast(MainActivity.this, 0, intent, 0);
در نهایت به منظور تکرار مداوم این فرایند با استفاده از متد setInexactRepeating در کلاس AlarmManager lمدت زمان تکرار مداوم آن را تعریف می کنیم با توجه به آنچه گفته شد این مدت زمان در مثال زیر 9 ثانیه خواهد بود
alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, time, 9 * 1000, pintent);
برای لغو این عملیات از کلاس الارم منیجر ، متد cancel را فراخوانی می کنیم به این صورت:
alarmManager.cancel(pintent);
و در نهایت افزون بر تعریف مجوزهای های لازم برای این کار، receiver موردنظرمان را که در مثال فوق MyReceiver است برای اجرای آن در دیوایس تعریف می کنیم . بدین منظور فایل AndroidManifest.xml را باز کرده و مجوز و رسیور مورد نظر را برای اجرای اپلیکیشن به این صورت می نویسیم:
مجوز:
<uses-permission android:name="com.android.alarm.permission.SET_ALARM" />
<receiver
android:name="yourpackegename.MyReceiver" >
به منظور درک بیشتر آموزش فوق مثالی برای دوستان طراحی می کنیم. امید است مطلوب نظر خوانندگان بوده باشد.
اگر در داخل برنامه اکلیپس یا اندروید استودیو قرار دارید پروژه جدیدی را ایجاد کنید
اکلیپس :File ⇒ New Android ⇒ Application Project
اندروید استودیو :File ⇒ New ⇒ New Project
اما اگر هنوز برنامه خود را باز نکرده اید یکی از برنامه های فوق را باز نموده و بعد از تعیین مشخصات(نامگذاری) ، تعیین حداقل sdk و نوع اکتیویتی (blank یا Empty) ، نام اکتیویتی ابتدایی و اصلی خود را همان MainActivity قرار دهید. بعد از لود کامل برنامه ، در مسیر res ⇒layout لایه متناظر اکتیوتی اصلی یعنی activity_main را پیدا نمود و کدهای مندرج و پیش فرض آن را پاک کرده و کدهای xml زیر را به آن اضافه کنید:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" > <Button android:id="@+id/start" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Start" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:layout_marginTop="193dp" /> <Button android:id="@+id/cancel" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Cancel" android:layout_centerVertical="true" android:layout_centerHorizontal="true" /> </RelativeLayout>
سپس کلاس اصلی یعنی MainActivity را باز کرده و کدهای زیر را در آن قرار می دهیم:
package examples.psrd.ir.myapplication; import android.app.Activity; import android.app.AlarmManager; import android.app.PendingIntent; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.Button; import java.util.Calendar; public class MainActivity extends Activity { Button startalarm, cancelalarm; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); startalarm = (Button) findViewById(R.id.start); cancelalarm = (Button) findViewById(R.id.cancel); startalarm.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); Calendar cal = Calendar.getInstance(); cal.add(Calendar.SECOND, 30); long time = cal.getTimeInMillis(); Intent i = new Intent(MainActivity.this, MyReceiver.class); PendingIntent pi = PendingIntent.getBroadcast(MainActivity.this, 0, i, 0); alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, time, 5 * 1000, pi); } }); cancelalarm.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { AlarmManager manager = (AlarmManager) getSystemService(ALARM_SERVICE); Intent i = new Intent(MainActivity.this, MyReceiver.class); PendingIntent pi = PendingIntent.getBroadcast(MainActivity.this, 0, i, 0); manager.cancel(pi); } }); } }
سپس کلاس جدیدی را با نام MyReceiver را می سازیم و آن را به نوع BroadcastReceiver گسترش می دهیم و با Toast هشدار الارم را در نشان می دهیم:
package examples.psrd.ir.myapplication; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.widget.Toast; public class MyReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent arg1) { Toast.makeText(context,"active the alarm",Toast.LENGTH_LONG).show(); } }
در نهایت فایل Androidmanfest .xml را باز کرده و علاوه بر تعریف مجوز لازم برای آلارم برنامه ، سرویس خود را برای برنامه تعریف می کنیم. در واقع وظیفه این سرویس رصد کردن تایم دیوایس برای نشان دادن عملیاتی خاص در تایم های مشخص شده در برنامه است.
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="examples.psrd.ir.myapplication"> <uses-permission android:name="com.android.alarm.permission.SET_ALARM" /> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity" android:label="@string/app_name" android:theme="@style/AppTheme.NoActionBar"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <receiver android:name="examples.psrd.ir.myapplication.MyReceiver" > </receiver> </activity> </application> </manifest>
حال می توانید پروژه خود را اجرا کرده و نتیجه کار خود را ببینید. اگر مشکلی در اجرای برنامه دارید یا سوال خاصی ذهن شما را به خود مشغول کرده است می توانید در قسمت دیدگاه ها آن را مطرح کنید. باعث خرسندی ماست که بتوانیم گام کوچکی در جهت پیشرفت شما برداریم.
موفق و پیروز باشید.
5 دیدگاه
یاسین · آگوست 17, 2018 در 9:04 ق.ظ
سلام
کاربرد عدد 80 در خط
calendar.add(Calendar.SECOND,80);
چیه؟
حامد قنبری · آگوست 24, 2018 در 12:46 ب.ظ
مقدار زمان ثانیه
مهدی · آگوست 31, 2018 در 8:26 ق.ظ
سلام من تمام کار هایی که گفته بودید رو انجام دادم ولی هیچ اتفاقی نیفتاد
رسا · می 13, 2019 در 1:25 ب.ظ
سلام خسته نباشید تمامی کار ها انجام شده نرم افزار ارور نداره اما هیچ کاری هم انجام نمیده
مهدی · می 18, 2019 در 3:20 ب.ظ
با سلام
بنده دارم یک اپ اندرویدی یادآوری می سازم و می خواهم در تاریخ مشخصی و درزمان مشخصی از همین تاریخ ، گوشی کاربر برای هشدار زنگ بزند ویا عمل دیگری را انجام دهد میخواستم لطف کنید در مورد نوشتن کد بخش جاوای آن که چگونه تاریخ و ساعت گرفته شده از کاربر را برای هشدار تنظیم کنیم توضیح کاملی ارائه بفرمایید باز هم از لطف شما ممنونم