هیچ دوره ای در سبد آموزش شما وجود ندارد
اعلانها (notification) در اندروید
صفحه نخستیک notification در اندروید پیامی است که با هدف آگاه کردن کاربر از یک موضوع در خارج از صفحات برنامه نشان داده می شود.هنگامی که به سیستم می گوییم یک Notification را صادر کند، ابتدا آن Notification به صورت یک آیکون در ناحیه ی مخصوص آن ها که یک نوار باریک در بالای صفحه است و نوار وضعیت نام دارد ظاهر می شود و برای مشاهده ی جزئیات اعلان نیز کاربر می تواند صفحه ی نوار وضعیت را باز کند. هر دو قسمت نوار وضعیت و صفحه ی جزئیات آن ها توسط سیستم کنترل می شود و کاربر می تواند در هر زمان به آن ها دسترسی داشته باشد.
یکی از راه های مناسب برای نمایش پیام های آگاه کننده استفاده از کلاس Toast می باشد، اما مشکل پیام هایی که با استفاده از این کلاس نمایش داده می شود ناپایدار بودن آن هاست؛ به این معنا که تنها برای چند ثانیه نمایش داده می شوند و پس از آن محو می گردند.
برای دیدن جزئیات بیشتر یک Notification باید صفحه نوار وضعیت را باز کنید. برای این منظور لازم است روی نوار وضعیت کلیک کنید و آن را به سمت پایین بکشید که در این حالت مانند تصویر زیر جزئیات اعلان ها نمایش داده می شود. ارتفاع معمولی هر اعلان نیز ۶۴dp می باشد.
همچنین می توانیم برای نشان دادن جزئیات بیشتر در اعلان ها از ویوهای بزرگ تری استفاده کنیم. اندازه ی یک اعلان به منظور نشان دادن جزئیات بیشتر می تواند به اندازه ی شش خط افزایش پیدا کند.
ساخت یک Notification
با دنبال کردن مراحل زیر می توانید به سادگی برای برنامه ی خود یک Notification بسازید.
گام اول – ایجاد سازنده ی Notification
به عنوان اولین گام در ایجاد سازنده ی Notification باید از متد ()NotificationCompat.Builder.build استفاده کنیم. همچنین برای تعیین ویژگی های مختلف Notification نظیر آیکون های کوچک و بزرگ، عنوان، اولویت و غیره نیز از این تابع سازنده استفاده خواهیم کرد.
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this)
گام دوم – تعیین ویژگی های Notification
با استفاده از تابع سازنده می توانیم ویژگی هایی که نیاز داریم را برای Notification تعیین کنیم. با این وجود تعیین ویژگی های زیر برای Notification ضروری است:
• تعیین یک آیکون کوچک با استفاده از متد ()setSmallIcon
• تعیین عنوان با استفاده از متد ()setContentTitle
• تعیین جزئیات متنی با استفاده از متد ()setContentText
mBuilder.setSmallIcon(R.drawable.notification_icon); mBuilder.setContentTitle("Notification Alert, Click Me!"); mBuilder.setContentText("Hi, This is Android Notification Detail!");
ویژگی های زیادی برای اعلان ها وجود دارد که تنظیم کردن بیشتر آن ها نیز اختیاری است؛ در ادامه برخی از آن ها آورده شده است.
گام سوم – افزودن عملیات به Notification
این بخش در ساختن یک اعلان اختیاری است و اگر شما می خواهید این امکان را برای کاربر ایجاد کنید تا با کلیک کردن روی اعلان به منظور مشاهده ی رویداد (های) اطلاع داده شده یا انجام کارهای دیگر به طور مستقیم به یک اکتیویتی از برنامه منتقل شود می توانید یک عملیات را به اعلان اضافه کنید.
عملیات با PendingIntent که حاوی یک Intent است که یک اکتیویتی در برنامه را آغاز می کند تعریف می شود. برای ایجاد ارتباط بین PendingIntent و رویداد ایجاد شده توسط کاربر، متد مناسب برای NotificationCompat.Builder فراخوانده می شود. به عنوان مثال اگر بخواهیم اکتیویتی با کلیک کردن کاربر روی متن اعلان آغاز شود باید PendingIntent را در فراخوانی متد ()setContentIntent قرار دهیم.
شی PendingIntent به عنوان یک نماینده از طرف برنامه ی ما عمل می کند و کمک می کند زمانی که اپلیکیشن در حال اجرا شدن نیست بتوانیم یک عملیات را انجام دهیم.
Intent resultIntent = new Intent(this, ResultActivity.class); TaskStackBuilder stackBuilder = TaskStackBuilder.create(this); 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);
گام چهارم – نمایش Notification
سرانجام باید شی Notification را با فراخوانی متد ()NotificationManager.notify برای سیستم ارسال کنیم. قبل از ارسال اعلان مطمئن شوید که تابع سازنده ی ()NotificationCompat.Builder.build را فراخوانی کرده اید. این تابع تمام تنظیمات تعیین شده برای اعلان را با آن ترکیب می کند و یک شی Notification جدید را برمی گرداند.
NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); // notificationID allows you to update the notification later on. mNotificationManager.notify(notificationID, mBuilder.build());
کلاس NotificationCompat.Builder
کلاس NotificationCompat.Builder کنترل پرچم ها را برای ما آسان می کند و همچنین طرح بندی اعلان های معمولی را نیز برای ما امکان پذیر می سازد. در جدول زیر بخشی از متدهای مهم و پر کاربرد این کلاس آورده شده است.
شماره | ثوابت و توضیحات |
1 | ()Notification build
تنظیمات تعیین شده را ترکیب می کند و یک شی Notification جدید را برمی گرداند. |
2 | (NotificationCompat.Builder setAutoCancel (boolean autoCancel
تنظیم این پرچم باعث می شود به طور خودکار با کلیک کردن کاربر روی اعلان، اعلان محو شود. |
3 | (NotificationCompat.Builder setContent (RemoteViews views
به جای ویوی استاندارد اعلان، از RemoteViews ارسالی استفاده خواهد شد. |
4 | (NotificationCompat.Builder setContentInfo (CharSequence info
متن سمت راست داخل اعلان را تنظیم می کند. چنانچه متد ()setStyle نیز برای اعلان تنظیم شود سیستم این متد را نادیده می گیرد. |
5 | NotificationCompat.Builder setContentIntent (PendingIntent intent)
PendingIntent که با کلیک کردن روی اعلان باید ارسال شود را تعیین می کند. |
6 | (NotificationCompat.Builder setContentText (CharSequence text
یک متن را برای توضیح در زیر عنوان تعیین می کند. این متن تنها به اندازه ی یک سطر نمایش داده می شود و چنانچه متد ()setStyle نیز برای اعلان تنظیم شود سیستم این متد را نادیده می گیرد. |
7 | (NotificationCompat.Builder setContentTitle (CharSequence title
عنوان اعلان را تعیین می کند. |
8 | (NotificationCompat.Builder setDefaults (int defaults
تنظیمات پیش فرضی که مورد نظر ما است را برای اعلان تعیین می کند. |
9 | NotificationCompat.Builder setLargeIcon (Bitmap icon)
این متد باید با یک تصویر با فرمت بیت مپ مقدار دهی شود. آیتم تنظیم شده توسط این متد همراه با متنی که متد بالا تعیین می کند در لحظه ی اتفاق افتادن اعلان برای چند لحظه در تمام محدوده ی نوار وضعیت نشان داده می شوند. |
10 | NotificationCompat.Builder setNumber (int number)
یک عدد را برای نمایش در سمت راست داخل اعلان تعیین می کند. تعیین متد های ()setContentInfo یا ()setStyle مانع از نمایش این عدد می شوند. |
11 | NotificationCompat.Builder setOngoing (boolean ongoing)
تعیین می کند که اعلان مورد نظر یک اعلان مداوم (ongoing) هست یا نه. |
12 | NotificationCompat.Builder setSmallIcon (int icon)
آیکون کوچک برای استفاده در layout های اعلان را تنظیم می کند. |
13 | (NotificationCompat.Builder setStyle (NotificationCompat.Style style
یک style برای اعلان را برای اعمال در زمان ساخت اضافه می کند. |
14 | NotificationCompat.Builder setTicker (CharSequence tickerText)
متنی را تنظیم می کند که در زمان اولین ظاهر شدن اعلان، در نوار وضعیت نمایش داده می شود. |
15 | NotificationCompat.Builder setVibrate (long[] pattern)
الگوی لرزش (vibration) مورد استفاده را تنظیم می کند. |
16 | NotificationCompat.Builder setWhen (long when)
زمان وقوع رویداد (event) را تنظیم می کند. اعلان های موجود در پنل با توجه به این زمان مرتب می شوند. |
مثال
مثال زیر نحوه عملکرد یک اعلان (Notification) اندرویدی را با استفاده از یک کلاس NotificationCompat.Builder که در اندروید نسخه 4.1 معرفی شده است، نمایش می دهد.
مرحله | توضیحات |
1 | با استفاده از اندروید استودیو یک پروژه ی جدید با نام Notifications تحت بسته ی com.example.notifications ایجاد کنید. نحوه ی ایجاد پروژه ی جدید در بخش مثال Hello world توضیح داده شده است. |
2 | فایل src/MainActivity.java را تغییر دهید و کدهایی را برای تعریف سه متدstartNotification() ()، startNotification و ()updateNotification برای پوشش حداکثر قابلیت مربوط به اعلان های اندرویدی اضافه کنید. |
3 | یک فایل جاوای جدید src/NotificationView.java را ایجاد کنید که برای نمایش یک layout جدید به کار می رود. این layout جدید به عنوان بخشی از اکتیویتی جدیدی است که در زمان کلیک کاربر بر روی هر یک از اعلان ها آغاز می شود. |
4 | فایل layout XML در مسیر ، res/layout/activity_main.xml را ، برای اضافه کردن دکمه با relative layout تغییر دهید. |
5 | یک فایل layout جدید res/layout/notification.xml را تعریف کنید. این فایل به عنوان فایل layout برای اکتیویتی جدیدی که با کلیک بر روی اعلان آغاز می شود، به کار می رود. |
6 | نیازی به تغییر ثابت های رشته پیش فرض نیست. اندروید استودیو ثابت های پیش فض را ساپورت میکند. |
7 | برای راه اندازی امولاتور اندروید اپلیکیشن را اجرا کنید و نتایج تغییرات اعمال شده در اپلیکیشن را بررسی کنید. |
در بخش زیر محتوای تعییر یافته ی فایل اکتیویتی اصلی src/com.example.notificationdemo/MainActivity.java ارائه شده است.
این فایل می تواند شامل هر کدام از متدهای چرخه ی حیات اصلی باشد.
package com.example.notificationdemo; import android.app.Activity; import android.app.NotificationManager; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.support.v4.app.NotificationCompat; import android.os.Bundle; import android.view.View; import android.widget.Button; public class MainActivity extends Activity { Button b1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); b1 = (Button)findViewById(R.id.button); b1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { addNotification(); } }); } private void addNotification() { NotificationCompat.Builder builder = new NotificationCompat.Builder(this) .setSmallIcon(R.drawable.abc) .setContentTitle("Notifications Example") .setContentText("This is a test notification"); Intent notificationIntent = new Intent(this, MainActivity.class); PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT); builder.setContentIntent(contentIntent); // Add as notification NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); manager.notify(0, builder.build()); } }
محتوای فایل res/layout/notification.xml :
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:layout_width="fill_parent" android:layout_height="400dp" android:text="Hi, Your Detailed notification view goes here...." /> </LinearLayout>
محتوای تغییر یافته ی فایل اکتیویتی اصلی src/com.example.notificationdemo/NotificationView.java :
package com.example.notificationdemo; import android.os.Bundle; import android.app.Activity; public class NotificationView extends Activity{ @Override public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.notification); } }
محتوای فایل 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" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="MainActivity"> <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Notification Example" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:textSize="30dp" /> <TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Tutorials point " android:textColor="#ff87ff09" android:textSize="30dp" android:layout_below="@+id/textView1" android:layout_centerHorizontal="true" android:layout_marginTop="48dp" /> <ImageButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/imageButton" android:src="@drawable/abc" android:layout_below="@+id/textView2" android:layout_centerHorizontal="true" android:layout_marginTop="42dp" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Notification" android:id="@+id/button" android:layout_marginTop="62dp" android:layout_below="@+id/imageButton" android:layout_centerHorizontal="true" /> </RelativeLayout>
محتوای فایل res/values/strings.xml برای تعریف دو ثابت جدید :
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="action_settings">Settings</string> <string name="app_name">tutorialspoint </string> </resources>
جزییات محتوای فایل AndroidManifest.xml :
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.notificationdemo" > <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.example.notificationdemo.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".NotificationView" android:label="Details of notification" android:parentActivityName=".MainActivity"> <meta-data android:name="android.support.PARENT_ACTIVITY" android:value=".MainActivity"/> </activity> </application> </manifest>
حالا می خواهیم اپلیکیشن با نام clicksite را اجرا کنیم. فرض می کنیم که AVD خود را در زمان نصب محیط ایجاد کرده باشید.
برای اجرای اپلیکیشن از Android Studio ، یکی از فایل های اکتیویتی پروژه ی خود را باز کنید و بر روی آیکن Run از نوار ابزار کلیک کنید. Android Studio ، اپلیکیش را بر روی AVD شما نصب می کند و آن را آغاز می کند.
حالا روی دکمه کلیک کنید ؛ در قسمت بالا یک پیام “New Message Alert!” ظاهر می شود. این پیام تنها برای لحظه ای ظاهر می شود و بعد از آن آیکنی کوچک در گوشه سمت چپ خواهید دید؛
می توانید روی آیکون کوچک کلیک کنید ، بعد از چند ثانیه اطلاعات مربوط به تاریخ نمایش داده می شود.
اعلان با View بزرگ (Big View Notification):
قطعه کد زیر نشان می دهد که چگونه اعلان (Notification ) ایجاد شده در قطعه قبلی را تغییر دهیم که از استایل نمایش بزرگ Inbox استفاده کند. من قصد دارم که متد () displayNotification را برای نشان دادن این قابلیت به روز رسانی کنم :
protected void displayNotification() { Log.i("Start", "notification"); /* Invoking the default notification service */ NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this); mBuilder.setContentTitle("New Message"); mBuilder.setContentText("You've received new message."); mBuilder.setTicker("New Message Alert!"); mBuilder.setSmallIcon(R.drawable.woman); /* Increase notification number every time a new notification arrives */ mBuilder.setNumber(++numMessages); /* Add Big View Specific Configuration */ NotificationCompat.InboxStyle inboxStyle = new NotificationCompat.InboxStyle(); String[] events = new String[6]; events[0] = new String("This is first line...."); events[1] = new String("This is second line..."); events[2] = new String("This is third line..."); events[3] = new String("This is 4th line..."); events[4] = new String("This is 5th line..."); events[5] = new String("This is 6th line..."); // Sets a title for the Inbox style big view inboxStyle.setBigContentTitle("Big Title Details:"); // Moves events into the big view for (int i=0; i < events.length; i++) { inboxStyle.addLine(events[i]); } mBuilder.setStyle(inboxStyle); /* Creates an explicit intent for an Activity in your app */ Intent resultIntent = new Intent(this, NotificationView.class); TaskStackBuilder stackBuilder = TaskStackBuilder.create(this); stackBuilder.addParentStack(NotificationView.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); mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); /* notificationID allows you to update the notification later on. */ mNotificationManager.notify(notificationID, mBuilder.build()); }