Alarm manager واستخدامه في برمجة تطبيقات اندرويد بشكل بسيط

بسم الله الرحمن الرحيم

السلام عليكم ورحمة الله وبركاته .

سنتكلم اليوم عن موضوع مهم للغاية ويستخدم كثيرا في البرامج وهو المنبه 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 إيقاف المنبه المضبوط سابقا .

أتمنى أن أكون ذكرت كل شيء … بإذن ستم إعداد دروس متقدمة لغير استخدام ..

السلام عليكم ورحمة الله وبركاته .

About مساهم

Check Also

تعلم برمجة تطبيق اندرويد لمدونتك البلوجر (4) الاخير

نكمل الدرس الرابع والأخير في تعلم برمجة وتطوير تطبيق اندرويد لموقعك الإلكتروني من خلال جلب الخلاصات RSS المثال الذي نعمل عليه لبرمجة تطبيقك لمدونتك البلوجر

تعلم برمجة تطبيق اندرويد لمدونتك البلوجر (3)

نكمل معاً الدرس الثالث في تعلم برمجة وتطوير تطبيق اندرويد لموقعك الإلكتروني من خلال جلب الخلاصات RSS المثال الذي نعمل عليه لبرمجة تطبيقك لمدونتك البلوجر

التقنيات التي نستطيع برمجة تطبيقات والعاب الاندرويد بها

هل أنت محتار من أين تريد البدأ في مجال برمجة التطبيقات للهواتف الذكية أو الألعاب عالية الاداء ؟ تعرف في هذا المقال عن اللغات والتقنيات واختر منها ما يناسبك لدخول هذا المجال

ضع بصمتك بتعليق يعبر عن امتنانك

هذا الموقع يستخدم Akismet للحدّ من التعليقات المزعجة والغير مرغوبة. تعرّف على كيفية معالجة بيانات تعليقك.