Notification و Alarm Manager در اندروید

Notification و Alarm Manager در اندروید
اندروید قابلیتی دارد که اجازه میدهد کاربران در بالای گوشی بتوانند Notification های مختلفی ببینند و با تپ کردن روی آن به قسمت مربوطه بروند، در واقع میتوانید Notification را در خارج از اپلیکیشن خود به کاربر نشان بدهید و اطلاعات مورد نظر را در اختیار کاربران قرار دهید، زمانی که به سیستم میگویید Notification را نمایش دهد ابتدا آیکون آن در بالای صفحه ی ظاهر میشود و زمانی که کاربر نوار را به سمت پایین میکشد میتواند اطلاعات بیشتر و محتوای Notification را ببیند. همچنین با استفاده از Alarm Manager میتوانید رویداد های مختلف را به اطلاع کاربران برسانید و عملیاتی که میخواهید را در زمان آینده انجام دهید.
سایت ساز سی می پلاس
در جشنواره طراحی سایت 20 تا 20 سی می پلاس وبسایت خود را بسازید و جایزه بگیرید
تصفیه هوا
سیستم تصفیه هوا هایدن ارایه شده توسط شرکت تهویه سپهر
خودتان را اینجا معرفی کنید

Notification در اندروید

Notification دارای المنت های زیر می باشد :
  1. محتوای عنوان
  2. آیکن بزرگ
  3. محتوای متنی
  4. محتوای داخلی
  5. آیکن کوچک
  6. زمانی که Notification نمایش داده شود
طریقه ی ساخت یک Notification :
ابتدا باید اطلاعات و عملیات را در شی NotificationCompat.Builder مشخص کنیم تا بتوانیم Notification را بسازیم، سپس میتوانیم ()NotificationCompat.Builder.build را صدا بزنیم که یک شی دارای اطلاعات ما را برمیگرداند، همچنین میتوانیم برای پاس دادن Notification به سیستم از شی NotificationManager.notify() استفاده کنیم.
یک شی Notification باید دارای موارد زیر باشد :
  1. یک آیکن کوچک، که توسط ()setSmallIcon نمایش داده میشود.
  2. یک عنوان که توسط ()setContentTitle نمایش داده میشود.
  3. یک محتوای متنی که توسط ()setContentText نمایش داده میشود.
به قطعه کد زیر توجه کنید :
NotificationCompat.Builder mBuilder =
        new NotificationCompat.Builder(this)
        .setSmallIcon(R.drawable.notification_icon)
        .setContentTitle("My notification")
        .setContentText("Hello World!");
// Creates an explicit intent for an Activity in your app
Intent resultIntent = new Intent(this, ResultActivity.class);

// The stack builder object will contain an artificial back stack for the
// started Activity.
// This ensures that navigating backward from the Activity leads out of
// your application to the Home screen.
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
// Adds the back stack for the Intent (but not the Intent itself)
stackBuilder.addParentStack(ResultActivity.class);
// Adds the Intent that starts the Activity to the top of the stack
stackBuilder.addNextIntent(resultIntent);
PendingIntent resultPendingIntent =
        stackBuilder.getPendingIntent(
            0,
            PendingIntent.FLAG_UPDATE_CURRENT
        );
mBuilder.setContentIntent(resultPendingIntent);
NotificationManager mNotificationManager =
    (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
// mId allows you to update the notification later on.
mNotificationManager.notify(mId, mBuilder.build());
حذف یا غیرفعال کردن Notification :
Notification باقی میماند تا زمانی که :
  1. کاربر از طریق دکمه ی Clear گوشی یا توسط انگشت خود Notification را از بین ببرد.
  2. شما متد ()cancel را برای Notification ID های خاصی فراخوانی کنید.
  3. شما متد ()cancelAll را برای تمام Notification ها فراخوانی کنید.

Alarm Manager در اندروید

گاهی اوقات میخواهیم که بعضی از عملیات ها در زمان دیرتری اتفاق بیوفتند، برای مثال در زمان بندی SMS میخواهیم یک SMS چند ساعت بعد ارسال شود یا برای مثال برنامه های To-Do List که میخواهیم یک اخطار بعدا به ما داده شود، کلاس AlarmManager دسترسی ما را به سیستم های Alarm فراهم میکند، این کار باعث میشود بتوانید عملیات مورد نظرتان در زمانی که میخواهید انجام دهید.
Alarm Manager بخشی از CPU را اشغال میکند و تا زمانی که متد ()onRecieve فعال است، آن بخش از CPU را اشغال میکند.
با یک مثال مناسب به بررسی این موضوع میپردازیم، در این مثال با یک زمان بندی یک SMS را در زمان مشخصی ارسال میکنیم، نیاز به دو کلاس داریم :
  1. کلاس MainActivity : در این کلاس برنامه آلارم را در یک زمان خاص مشخص میکنیم.
  2. کلاس AlarmReciever : زمانی که آلارم زده شد، برنامه یک SMS را در زمان خاص ارسال میکند.کلاس AlarmReciever از کلاس BroadcastReceiver مشتق میشود و متد ()onRecieve در آن override میشود و درون آن میتوانید یک Activity یا Service را بنابه نیاز خود اجرا کنید.
همچنین نیاز به مجوز Alarm  داریم که خط زیر را در فایل Manifest اضافه میکنیم :
 <uses-permission android:name="com.android.alarm.permission.SET_ALARM"/> 
در نهایت فایل Manifest ما باید به صورت زیر شود :
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.learnandroideasily.blogspot"
    android:versionCode="1"
    android:versionName="1.0" >

            <uses-sdk android:minSdkVersion="8"
                             android:targetSdkVersion="17" />
             <!-- permission required to use Alarm Manager -->
            <uses-permission android:name="com.android.alarm.permission.SET_ALARM"/>
            <!-- permission required to Send SMS -->
            <uses-permission android:name="android.permission.SEND_SMS"/>
   
            <application
                     android:icon="@drawable/ic_launcher"
                     android:label="Demo App" >
                    <activity
                               android:name=".MainActivity"
                               android:label="Demo App" >
                              <intent-filter>
                                           <action android:name="android.intent.action.MAIN" />
                                           <category android:name="android.intent.category.LAUNCHER" />
                              </intent-filter>
                   </activity>
               <!-- Register the Alarm Receiver -->
                   <receiver android:name=".AlarmReciever"/>
           
         </application>
</manifest>
همچنین فایل main.xml را باید طراحی کنیم، طراحی این فایل دلخواه میباشد اما میتوانید مطابق به لایه بندی زیر آن را طراحی کنید :
<LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    android:gravity="center_vertical"
    xmlns:android="http://schemas.android.com/apk/res/android">

    <TextView
        android:id="@+id/textView1"
        android:gravity="center_horizontal"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="Alarm Manager Example"
        android:textAppearance="?android:attr/textAppearanceLarge" />

    <Button
        android:id="@+id/button1"
        android:layout_marginTop="25dp"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="Schedule The Alarm"
        android:onClick="scheduleAlarm"/>

</LinearLayout>
همچنین در کلاس MainActivity.java فعالیت هایی که مدنظر داشتیم را انجام میدهیم :
public class MainActivity extends Activity
{
       @Override
       public void onCreate(Bundle savedInstanceState)
      {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.main);
      }

    public void scheduleAlarm(View V)
    {
            // time at which alarm will be scheduled here alarm is scheduled at 1 day from current time, 
            // we fetch  the current time in milliseconds and added 1 day time
            // i.e. 24*60*60*1000= 86,400,000   milliseconds in a day       
            Long time = new GregorianCalendar().getTimeInMillis()+24*60*60*1000;

            // create an Intent and set the class which will execute when Alarm triggers, here we have
            // given AlarmReciever in the Intent, the onRecieve() method of this class will execute when
            // alarm triggers and 
            //we will write the code to send SMS inside onRecieve() method pf Alarmreciever class
            Intent intentAlarm = new Intent(this, AlarmReciever.class);
      
            // create the object
            AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);

            //set the alarm for particular time
            alarmManager.set(AlarmManager.RTC_WAKEUP,time, PendingIntent.getBroadcast(this,1,  intentAlarm, PendingIntent.FLAG_UPDATE_CURRENT));
            Toast.makeText(this, "Alarm Scheduled for Tommrrow", Toast.LENGTH_LONG).show();
        
    }
}
و در نهایت در کلاس AlarmReciever.java پیامک را در زمان مورد نظر ارسال میکنیم :
public class AlarmReciever extends BroadcastReceiver
{
         @Override
            public void onReceive(Context context, Intent intent)
            {
                    // TODO Auto-generated method stub
                
                   
                      // here you can start an activity or service depending on your need
                     // for ex you can start an activity to vibrate phone or to ring the phone   
                                    
                    String phoneNumberReciver="9718202185";// phone number to which SMS to be send
                    String message="Hi I will be there later, See You soon";// message to send
                    SmsManager sms = SmsManager.getDefault();
                    sms.sendTextMessage(phoneNumberReciver, null, message, null, null);
                    // Show the toast  like in above screen shot
                    Toast.makeText(context, "Alarm Triggered and SMS Sent", Toast.LENGTH_LONG).show();
             }
      
}

محمد یه دانشجوی فناوری اطلاعات هست که از سال 92 فعالیتش رو شروع کرد، در حال حاضر در زمینه ی برنامه نویسی تحت وب و اندروید و شبکه های ارتباطی سیسکو فعالیت میکنه .

نظرات و سوالات کاربران

ارسال پاسخ maryam
maryam
یکشنبه ۱۲ آذر ۱۳۹۶ ۲۲:۳۹
سلام من الارم منیجرم بعد از لاک شدن گوشی و همچنین بعد از خاموش شدن گوشی از کار میفته نوتیفکشن و یا اس ام اس ارسال نمیشه اون موقع بعد از دوباره روشن و شدن گوشی لطفا راهنمایی ام کنید بسیار ممنونم
ارسال پاسخ وحید
وحید
پنج شنبه ۰۸ مرداد ۱۳۹۴ ۲۳:۲۶

سلام. ممنون بابت آموزش. چندتا سوال دارم:
1. من به جای برودکست از سرویس استفاده کردم. به نظرتون چه فرقی می کنه؟
2. استفاده از آلارم منیجر بیشتر باتری مصرف می کنه با استفاده از handler و time برای انجام کاری در آینده؟

3. چرا آلارم منیجر با این که در اکتیویتی نوشته می شه باز هم بعد از خروج از برنامه در حال فعالیت هست؟
4. من یک آلارم منیجیر نوشتم که بعد از مثلا 100 ثانیه یک سرویس رو اجرا می کنه و یک دکمه گذاشتم به نام stop که وقتی روش کلیک می شه آلارم منیجر متناسب با همون pendingintent کنسل بشه و سرویس هم stop بشه. وقتی توی برنامه آلارم منیجر رو راه می ندازم و بعد که دکمه stop رو می زنم عملیات متوقف می شه اما وقتی که آلارم منیجر رو راه می ندازم و بعد از برنامه خارج می شم و دوباره وارد برنامه می شم و stop رو می زنم آلارم منیجر متوقف نمی شه. دلیلش چیه؟ چیکار کنم؟
5. از کجا بفهمم که یک سرویس و یک آلارم منیجر در حال فعالیت هستند؟