بسم الله الرحمن الرحيم
السلام عليكم ورحمة الله وبركاته .
سنتكلم اليوم عن موضوع مهم للغاية ويستخدم كثيرا في البرامج وهو المنبه Alarm وكيفية استخدامه في التطبيقات .
سنستعمل كلاس Alarm Manager
أولا : يجب علينا تحديد الأكتيفيتي المراد الذهاب عند انتهاء الوقت .
Intent intent = new Intent(first.this,second.class);
ثانيا : سنستخدم Pending intent وهو intent خاص يستخدم لأنواع محددة من التطبيقات ( Alarm , Notification ) ويتميز بأنه يحتاج إلى :
- context .
- request code وهذا الكود الخاص ب alarm manager وهو ما يميزه عن باقي alarm managers ( عبارة عن int ) .
- intent .
- flag سنضع في هذه الخانة PendingIntent.FLAG_UPDATE_CURRENT وتعني انه ممكن أن نستعمل ال pending intent و المنبه مرة أخرى , و إن كنت لن تستخدمه سوى مرة واحدة في كل التطبيق ولمرة واحدة بإمكانك وضع 0 ولكن أنا أفضل وضع PendingIntent.FLAG_UPDATE_CURRENT في كل الحالات .
سنتكلم عنه بالتفصيل في دروس لاحقة .
PendingIntent pending_intent = PendingIntent.getActivity(getApplicationContext(),01,intent,PendingIntent.FLAG_UPDATE_CURRENT);
ثالثا : سنستخدم كلاس Alarm manager :
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
get System Service اي أننا سنجلب خدمة محددة .
رابعا : سنضبط المنبه بدالة set التي لها ثلاث باراميترات :
- الباراميتر الأول هو نوع المنبه وهذه خاصية مفيدة ولكن سنتكلم عن نوعان فقط مما يحتاجنا :
AlarmManager.RTC
وخاصيته أنه إذا كان الشاشة غير فعالة وانتهى الوقت فلن يتم التنفيذ حتى تشغيل الشاشة وإذا كانت فعالة فعلى وقته النظامي .
AlarmManager.RTC_WAKEUP
وخاصيته أنه سيتم تنفيذ المهمة في حالتي الشاشة فعالة أو غير ذلك .
- الباراميتر الثاني هو المدة المطلوبة ونكتب أولا : System.currentTimeMillis() أي جلب الوقت من الآن + المدة المطلوبة بالميلي ثانية ( أي كل 1000 ميلي ثانية تساوي 1 ثانية ) .
System.currentTimeMillis() + 2000
- الباراميتر الثالث والأخير لدالة set هو pending intent وقد ضبطناه سابقا .
يصبح شكل الدلة في الأخير :
alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+ 2000, pending_intent);
ولإلغاء المنبه نستخدم دالة cancel :
alarmManager.cancel(pending_intent);
ولها باراميتر واحد هو pending intent وقد ضبطناه سابقا .
سنتكلم عن أمر أنه في حال احتجنا الى ايقاف المنبه من خارج الاكتيفيتي التي انشأناه فيها فكل ماعلينا إعادة كتابة الكود بنفس request code ووضع دالة cancel بدل من set .
نعطي مثال :
ملف اللياوت ل first.java :
<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" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".first"> <EditText android:layout_width="150dp" android:layout_height="wrap_content" android:id="@+id/editText" android:inputType="number" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:layout_marginTop="100dp" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Start" android:id="@+id/button" android:layout_centerVertical="true" android:layout_centerHorizontal="true" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Cancel" android:id="@+id/button2" android:layout_below="@+id/button" android:layout_centerHorizontal="true" android:layout_marginTop="44dp" /> </RelativeLayout>
وضعنا 2 button لبدأ المنبه وإيقافه و 1 EditText لتحديد الزمن ووحددنا نوعية الإدخال ارقام فقط .
وملف الجافا first.java :
public class first extends AppCompatActivity { EditText enter_time; Button start, cancel; AlarmManager alarmManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_first); enter_time = (EditText) findViewById(R.id.editText); start = (Button) findViewById(R.id.button); cancel = (Button) findViewById(R.id.button2); start.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String ed = enter_time.getText().toString(); if (ed.length() > 0) { Intent intent = new Intent(first.this, second.class); PendingIntent pending_intent = PendingIntent.getActivity(getApplicationContext(), 01, intent, PendingIntent.FLAG_UPDATE_CURRENT); alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + Integer.parseInt(enter_time.getText().toString()) * 1000, pending_intent); } else { Toast.makeText(first.this, "إدخال خاطئ", Toast.LENGTH_SHORT).show(); } } }); cancel.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(first.this, second.class); PendingIntent pending_intent = PendingIntent.getActivity(getApplicationContext(), 01, intent, PendingIntent.FLAG_UPDATE_CURRENT); alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); alarmManager.cancel(pending_intent); } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_first, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } }
وفي ملف الجاف عرفنا EditText و 2 button و AlarmManager .
ومهمة الزر الأول start جلب النص من EditText على شرط أن يكون طوله أكبر من الصفر لضمان الا يتم إدخال نص فارغ ومن ثم أخذ القيمة على شكل Integer بواسطة الكود :
Integer.parseInt(String s);
بشرط أن يكون النص s رقم فعليا ووضعه وقت لمنبه ثم تشغيله للذهاب للاكتيفيتي الأخرى second وهي اكتيفيتي عادية لاتحوي شيء .
ومهمة الزر الثاني cancel إيقاف المنبه المضبوط سابقا .
أتمنى أن أكون ذكرت كل شيء … بإذن ستم إعداد دروس متقدمة لغير استخدام ..
السلام عليكم ورحمة الله وبركاته .