From b8b3645a9799c38ad68549316ebbf7a4849f2e0c Mon Sep 17 00:00:00 2001 From: Scott Main <> Date: Sun, 26 Apr 2009 15:50:49 -0700 Subject: AI 147803: add docs and images for docs on Toast and Notification docs also edit the Notification class doc BUG=1800118 Automated import of CL 147803 --- docs/html/guide/guide_toc.cs | 4 +- docs/html/guide/topics/ui/notifiers/index.jd | 107 +++++ .../guide/topics/ui/notifiers/notifications.jd | 432 +++++++++++++++++++++ docs/html/guide/topics/ui/notifiers/toasts.jd | 154 ++++++++ docs/html/images/custom_message.png | Bin 0 -> 11120 bytes docs/html/images/custom_toast.png | Bin 0 -> 19966 bytes docs/html/images/notifications_window.png | Bin 0 -> 10511 bytes docs/html/images/status_bar.png | Bin 0 -> 3719 bytes docs/html/images/toast.png | Bin 0 -> 6544 bytes 9 files changed, 695 insertions(+), 2 deletions(-) create mode 100644 docs/html/guide/topics/ui/notifiers/index.jd create mode 100644 docs/html/guide/topics/ui/notifiers/notifications.jd create mode 100644 docs/html/guide/topics/ui/notifiers/toasts.jd create mode 100755 docs/html/images/custom_message.png create mode 100755 docs/html/images/custom_toast.png create mode 100755 docs/html/images/notifications_window.png create mode 100755 docs/html/images/status_bar.png create mode 100644 docs/html/images/toast.png (limited to 'docs') diff --git a/docs/html/guide/guide_toc.cs b/docs/html/guide/guide_toc.cs index 39f4abf..5367cb2 100644 --- a/docs/html/guide/guide_toc.cs +++ b/docs/html/guide/guide_toc.cs @@ -19,9 +19,9 @@
Several types of situations may arise that require you to notify the user +about an event that occurs in your application. Some events require the user to respond +and others do not. For example:
+Each of these notification tasks can be achieved using a different technique:
+This document summarizes each of these techniques for notifying the user and includes +links to full documentation.
+ + +
+
+A toast notificaiton is a message that pops up on the surface of the window. +It only fills the amount of space required for the message and the user's current +activity remains visible and interactive. The notification automatically fades in and +out, and does not accept interaction events. Because a toast can be created from a background +{@link android.app.Service}, it appears even if the application isn't visible.
+ +A toast is best for short text messages, such as "File saved," +when you're fairly certain the user is paying attention +to the screen. A toast can not accept user interaction events; if you'd like +the user to respond and take action, consider using a +Status Bar Notification instead.
+ +For more information, refer to Creating Toast Notifications.
+ + +
+
+A status bar notification adds an icon to the system's status bar +(with an optional ticker-text message) and an expanded message in the "Notifications" window. +When the user selects the expanded message, Android fires an +{@link android.content.Intent} that is defined by the notification (usually to launch an +{@link android.app.Activity}). +You can also configure the notification to alert the user with a sound, a vibration, and flashing +lights on the device.
+ +This kind of notification is ideal when your application is working in +a background {@link android.app.Service} and needs to +notify the user about an event. If you need to alert the user about an event that occurs +while your Activity is still in focus, consider using a +Dialog Notification instead.
+ +For more information, refer to +Creating Status Bar Notifications.
+ + +
+
+A dialog is usually a small window that appears in front of the current Activity. +The underlying Activity loses focus and the dialog accepts all user interaction. +Dialogs are normally used +for notifications and short activities that directly relate to the application in progress.
+ +You should use a dialog when you need to show a progress bar or a short +message that requires confirmation from the user (such as an alert with "OK" and "Cancel" buttons). +You can use also use dialogs as integral componenents +in your application's UI and for other purposes besides notifications. +For a complete discussion on all the available types of dialogs, +including its uses for notifications, refer to +Creating Dialogs.
+ + + diff --git a/docs/html/guide/topics/ui/notifiers/notifications.jd b/docs/html/guide/topics/ui/notifiers/notifications.jd new file mode 100644 index 0000000..e6fa48f --- /dev/null +++ b/docs/html/guide/topics/ui/notifiers/notifications.jd @@ -0,0 +1,432 @@ +page.title=Creating Status Bar Notifications +parent.title=Notifying the User +parent.link=index.html +@jd:body + +A status bar notification adds an icon to the system's status bar +(with an optional ticker-text message) and an expanded message in the "Notifications" window. +When the user selects the expanded message, Android fires an +{@link android.content.Intent} that is defined by the notification (usually to launch an +{@link android.app.Activity}). +You can also configure the notification to alert the user with a sound, a vibration, and flashing +lights on the device.
+ +A status bar notification should be used for any case in +which a background Service needs to alert the user about an event that requires a response. A background Service +should never launch an Activity on its own in order to receive user interaction. +The Service should instead create a status bar notification that will launch the Activity +when selected by the user.
+ +The screenshot below shows the status bar with a notification icon on the left side.
+
+
+The next screenshot shows the notification's expanded message in the "Notifications" window. +The user can reveal the Notifications window by pulling down the status bar +(or selecting Notifications from the Home options menu).
+
+
+
+An {@link android.app.Activity} or {@link android.app.Service} can initiate a status bar +notification. Because an Activity can perform actions only while it is +active and in focus, you should create your status bar notifications from a +Service. This way, the notification can be created from the background, +while the user is using another application or +while the device is asleep. To create a notification, you must use two +classes: {@link android.app.Notification} and {@link android.app.NotificationManager}.
+ +Use an instance of the {@link android.app.Notification} class to define the properties of your +status bar notification, such as the status bar icon, the expanded message, and extra settings such +as a sound to play. The {@link android.app.NotificationManager} is an Android system service that +executes and manages all Notifications. You do not instantiate the NotificationManager. In order +to give it your Notification, you must retrieve a reference to the NotificationManager with +{@link android.app.Activity#getSystemService(String) getSystemService()} and +then, when you want to notify the user, pass it your Notification object with +{@link android.app.NotificationManager#notify(int,Notification) notify()}.
+ +To create a status bar notification:
++String ns = Context.NOTIFICATION_SERVICE; +NotificationManager mNotificationManager = (NotificationManager) getSystemService(ns); ++
+int icon = R.drawable.notification_icon; +CharSequence tickerText = "Hello"; +long when = System.currentTimeMillis(); + +Notification notification = new Notification(icon, tickerText, when); ++
+Context context = getApplicationContext(); +CharSequence contentTitle = "My notification"; +CharSequence contentText = "Hello World!"; +Intent notificationIntent = new Intent(this, MyClass.class); +PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0); + +notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent); ++
+private static final int HELLO_ID = 1; + +mNotificationManager.notify(HELLO_ID, notification); ++
That's it. Your user has now been notified.
+The {@link android.app.NotificationManager} is a system service that manages all +notifications. You must retrieve a reference to it with the +{@link android.app.Activity#getSystemService(String) getSystemService()} method. +For example:
++String ns = Context.NOTIFICATION_SERVICE; +NotificationManager mNotificationManager = (NotificationManager) getSystemService(ns); ++ +
When you want to send your status bar notification, pass the Notification object +to the NotificationManager with {@link android.app.NotificationManager#notify(int,Notification)}. +The first parameter is the unique ID for the Notification and the second is the Notification object. +The ID uniquely identifies the Notification from within your +application. This is necessary if you need to update the Notification or (if +your application manages different kinds of Notifications) select the appropriate action +when the user returns to your application via the Intent defined in the Notification.
+ +To clear the status bar notification when the user selects it from the Notifications +window, add the "FLAG_AUTO_CANCEL" flag to your Notification object. You can also clear it +manually with {@link android.app.NotificationManager#cancel(int)}, passing it the notification ID, +or clear all your Notifications with {@link android.app.NotificationManager#cancelAll()}.
+ + +A {@link android.app.Notification} object defines the details of the notification +message that is displayed in the status bar and "Notifications" window, and any other +alert settings, such as sounds and blinking lights.
+ +A status bar notification requires all of the following:
+Optional settings for the status bar notification include:
+The starter-kit for a new Notification includes the +{@link android.app.Notification#Notification(int,CharSequence,long)} constructor and the +{@link android.app.Notification#setLatestEventInfo(Context,CharSequence,CharSequence,PendingIntent)} +method. These define all the required settings for a Notification. +The following snippet demonstrates a basic Notification setup:
++int icon = R.drawable.notification_icon; // icon from resources +CharSequence tickerText = "Hello"; // ticker-text +long when = System.currentTimeMillis(); // notification time +Context context = getApplicationContext(); // application Context +CharSequence contentTitle = "My notification"; // expanded message title +CharSequence contentText = "Hello World!"; // expanded message text + +Intent notificationIntent = new Intent(this, MyClass.class); +PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0); + +// the next two lines initialize the Notification, using the configurations above +Notification notification = new Notification(icon, tickerText, when); +notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent); ++ + +
You can update the information in your status bar notification as events +continue to occur in your application. For example, when a new SMS text message arrives +before previous messages have been read, the Messaging application updates the existing +notification to display the total number of new messages received. +This practice of updating an existing Notification is much better than adding new Notifications +to the NotificationManager because it avoids clutter in the Notifications window.
+ +Because each notification is uniquely identified +by the NotificationManager with an integer ID, you can revise the notification by calling +{@link android.app.Notification#setLatestEventInfo(Context,CharSequence,CharSequence,PendingIntent) +setLatestEventInfo()} with new values, change some field values of the Notification, and then call +{@link android.app.NotificationManager#notify(int,Notification) notify()} again.
+ +You can revise each property with the object member fields +(except for the Context and the expanded message title and text). You should always +revise the text message when you update the notification by calling +{@link android.app.Notification#setLatestEventInfo(Context,CharSequence,CharSequence,PendingIntent) +setLatestEventInfo()} with new values for contentTitle and contentText. +Then call {@link android.app.NotificationManager#notify(int,Notification) notify()} to update the +notification. (Of course, if you've created a custom expanded +view, then updating these title and text values has no effect.)
+ + +You can alert the user with the default notification sound +(which is defined by the user) or with a sound specified by your application.
+ +To use the user's default sound, add "DEFAULT_SOUND" to the defaults field:
++notification.defaults |= Notification.DEFAULT_SOUND; ++ +
To use a different sound with your notifications, pass a Uri reference to the +sound field. +The following example uses a known audio file saved to the device SD card:
+
+notification.sound = Uri.parse("file:///sdcard/notification/ringer.mp3");
+
+
+In the next example, the audio file is chosen from the internal +{@link android.provider.MediaStore.Audio.Media MediaStore}'s {@link android.content.ContentProvider}:
++notification.sound = Uri.withAppendedPath(Audio.Media.INTERNAL_CONTENT_URI, "6"); ++ +
In this case, the exact ID of the media file ("6") is known and appended to the content +{@link android.net.Uri}. If you don't know the exact ID, you must query all the +media available in the MediaStore with a {@link android.content.ContentResolver}. +See the Content Providers +documentation for more information on using a ContentResolver.
+ +If you want the sound to continuously repeat until the user responds to the notification +or the notification is cancelled, add "FLAG_INSISTENT" to the flags field.
+ +Note: If the defaults field includes +"DEFAULT_SOUND", then the default sound overrides any sound defined by the sound field.
+ + +You can alert the user with the the default +vibration pattern or with a vibration pattern defined by your application.
+ +To use the default pattern, add "DEFAULT_VIBRATE" to the defaults field:
++notification.defaults |= Notification.DEFAULT_VIBRATE; ++ +
To define your own vibration pattern, pass an array of long values to the +vibrate field:
+
+long[] vibrate = {0,100,200,300};
+notification.vibrate = vibrate;
+
+
+The long array defines the alternating pattern for the length of vibration off and on +(in milliseconds). The first value is how long to wait (off) before beginning, the second +value is the length of the first vibration, the third is the next length off, and so on. +The pattern can be as long as you like, but it can't be set to repeat. +
+ +Note: If the defaults field includes +"DEFAULT_VIBRATE", then the default vibration overrides any vibration defined by the +vibrate field.
+ + +To alert the user by flashing LED lights, you can implement the default +light pattern (if available), or define your own color and pattern for the lights.
+ +To use the default light setting, add "DEFAULT_LIGHTS" to the defaults field:
++notification.defaults |= Notification.DEFAULT_LIGHTS; ++ +
To define your own color and pattern, define a value for the ledARGB field +(for the color), the ledOffMS field (length of time, in milliseconds, to +keep the light off), the ledOnMS (length of time, in milliseconds, to keep the light on), +and also add "FLAG_SHOW_LIGHTS" to the flags field:
++notification.ledARGB = 0xff00ff00; +notification.ledOnMS = 300; +notification.ledOffMS = 1000; +notification.flags |= Notification.FLAG_SHOW_LIGHTS; ++ +
In this example, the green light repeatedly flashes on for 300 milliseconds and +turns off for one second. Not every color in the spectrum is supported by the +device LEDs, and not every device supports the same colors, so the hardware +estimates to the best of its ability. Green is the most common notification color.
+ + +You can add several more features to your notifications +using Notification fields and flags. Some useful features include the following:
+ +See the {@link android.app.Notification} class reference for more information about additional +features that you can customize for your application.
+ + +
+
+By default, the expanded view used in the "Notifications" window includes a basic title and text +message. These are defined by the contentTitle and contentText +parameters of the {@link android.app.Notification#setLatestEventInfo(Context,CharSequence,CharSequence,PendingIntent) +setLatestEventInfo()} method. However, you can also define a custom layout for the expanded view using +{@link android.widget.RemoteViews}. The screenshot to the right shows an example of a +custom expanded view that uses an ImageView and TextView in a LinearLayout.
+ +To define your own layout for the expanded message, +instantiate a {@link android.widget.RemoteViews} object and +pass it to the contentView field of your Notification. Pass the +{@link android.app.PendingIntent} to the contentIntent field.
+ +Creating a custom expanded view is best understood with an example:
+ +custom_notification_layout.xml and
+ build it like so:
++<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:orientation="horizontal" + android:layout_width="fill_parent" + android:layout_height="fill_parent" + android:padding="3dp" + > + <ImageView android:id="@+id/image" + android:layout_width="wrap_content" + android:layout_height="fill_parent" + android:layout_marginRight="10dp" + /> + <TextView android:id="@+id/text" + android:layout_width="wrap_content" + android:layout_height="fill_parent" + android:textColor="#000" + /> +</LinearLayout> ++ +
This layout is used for the expanded view, + but the content of the ImageView and TextView still needs to be defined by the applicaiton. + RemoteViews offers some convenient methods that allow you to define this content...
++RemoteViews contentView = new RemoteViews(getPackageName(), R.layout.custom_notification_layout); +contentView.setImageViewResource(R.id.image, R.drawable.notification_image); +contentView.setTextViewText(R.id.text, "Hello, this message is in a custom expanded view"); +notification.contentView = contentView; ++ +
As shown here, pass the applicaiton's package name and the layout + resource ID to the RemoteViews constructor. Then, define the content for the ImageView and TextView, + using the {@link android.widget.RemoteViews#setImageViewResource(int, int) setImageViewResource()} + and {@link android.widget.RemoteViews#setTextViewText(int, CharSequence) setTextViewText()}. + In each case, pass the reference ID of the appropriate View object that you want to set, along with + the value for that View. Finally, the RemoteViews object is passed to the Notification in the + contentView field.
++Intent notificationIntent = new Intent(this, MyClass.class); +PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0); +notification.contentIntent = contentIntent; ++
mNotificationManager.notify(CUSTOM_VIEW_ID, notification);+
The RemoteViews class also includes methods that you can use to easily add a +{@link android.widget.Chronometer} or {@link android.widget.ProgressBar} +in your notification's expanded view. For more information about creating custom layouts with +RemoteViews, refer to the {@link android.widget.RemoteViews} class reference.
+ +Note: +When creating a custom expanded view, you must take special care to ensure that your +custom layout functions properly in different device orientations and resolutions. While this +advice applies to all View layouts created on Android, it is especially important in this case +because your layout real estate is very restricted. So don't make your custom layout too +complex and be sure to test it in various configurations.
+ + + + diff --git a/docs/html/guide/topics/ui/notifiers/toasts.jd b/docs/html/guide/topics/ui/notifiers/toasts.jd new file mode 100644 index 0000000..a800c3c --- /dev/null +++ b/docs/html/guide/topics/ui/notifiers/toasts.jd @@ -0,0 +1,154 @@ +page.title=Creating Toast Notifications +parent.title=Notifying the User +parent.link=index.html +@jd:body + +A toast notificaiton is a message that pops up on the surface of the window. +It only fills the amount of space required for the message and the user's current +activity remains visible and interactive. The notification automatically fades in and +out, and does not accept interaction events.
+ +The screenshot below shows an example toast notification from the Alarm application. +Once an alarm is turned on, a toast is displayed to assure you that the +alarm was set.
+
+
+A toast can be created and displayed from an {@link android.app.Activity} or +{@link android.app.Service}. If you create a toast notification from a Service, it +appears in front of the Activity currently in focus.
+ +If user response to the notification is required, consider using a +Status Bar Notification.
+ + +First, instantiate a {@link android.widget.Toast} +object with one of the {@link android.widget.Toast#makeText(Context,int,int) makeText()} methods. +This method takes three parameters: the application {@link android.content.Context}, +the text message, and the duration for the toast. It returns a properly initialized Toast +object. You can display the toast notification with {@link android.widget.Toast#show()}, +as shown in the following example:
+ ++Context context = getApplicationContext(); +CharSequence text = "Hello toast!"; +int duration = Toast.LENGTH_SHORT; + +Toast toast = Toast.makeText(context, text, duration); +toast.show(); ++ +
This example demonstrates everything you need for most toast notifications. +You should rarely need anything else. You may, however, want to position the +toast differently or even use your own layout instead of a simple text message. +The following sections describe how you can do these things.
+ +You can also chain your methods and avoid holding on to the Toast object, like this:
+Toast.makeText(context, text, duration).show();+ + +
A standard toast notification appears near the bottom of the screen, centered horizontally. +You can change this position with the {@link android.widget.Toast#setGravity(int,int,int)} +method. This accepts three parameters: a {@link android.view.Gravity} constant, +an x-position offset, and a y-position offset.
+ +For example, if you decide that the toast should appear in the top-left corner, you can set the +gravity like this:
++toast.setGravity(Gravity.TOP|Gravity.LEFT, 0, 0); ++ +
If you want to nudge the position to the right, increase the value of the second parameter. +To nudge it down, increase the value of the last parameter. + + +
+
+If a simple text message isn't enough, you can create a customized layout for your +toast notification. To create a custom layout, define a View layout, +in XML or in your application code, and pass the root {@link android.view.View} object +to the {@link android.widget.Toast#setView(View)} method.
+ +For example, you can create the layout for the toast visible in the screenshot to the right +with the following XML (saved as toast_layout.xml):
++<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@+id/toast_layout_root" + android:orientation="horizontal" + android:layout_width="fill_parent" + android:layout_height="fill_parent" + android:padding="10dp" + android:background="#DAAA" + > + <ImageView android:id="@+id/image" + android:layout_width="wrap_content" + android:layout_height="fill_parent" + android:layout_marginRight="10dp" + /> + <TextView android:id="@+id/text" + android:layout_width="wrap_content" + android:layout_height="fill_parent" + android:textColor="#FFF" + /> +</LinearLayout> ++ +
Notice that the ID of the LinearLayout element is "toast_layout". You must use this +ID to inflate the layout from the XML, as shown here:
+ +
+LayoutInflater inflater = getLayoutInflater();
+View layout = inflater.inflate(R.layout.toast_layout,
+ (ViewGroup) findViewById(R.id.toast_layout_root));
+
+ImageView image = (ImageView) layout.findViewById(R.id.image);
+image.setImageResource(R.drawable.android);
+TextView text = (TextView) layout.findViewById(R.id.text);
+text.setText("Hello! This is a custom toast!");
+
+Toast toast = new Toast(getApplicationContext());
+toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0);
+toast.setDuration(Toast.LENGTH_LONG);
+toast.setView(layout);
+toast.show();
+
+
+First, retrieve the {@link android.view.LayoutInflater} with +{@link android.app.Activity#getLayoutInflater()} +(or {@link android.content.Context#getSystemService(String) getSystemService()}), +and then inflate the layout from XML using +{@link android.view.LayoutInflater#inflate(int, ViewGroup)}. The first parameter +is the layout resource ID and the second is the root View. You can use +this inflated layout to find more View objects in the layout, so now capture and +define the content for the ImageView and TextView elements. Finally, create +a new Toast with {@link android.widget.Toast#Toast(Context)} and set some properties +of the toast, such as the gravity and duration. Then call +{@link android.widget.Toast#setView(View)} and pass it the inflated layout. +You can now display the toast with your custom layout by calling +{@link android.widget.Toast#show()}.
+ +Note: Do not use the public constructor for a Toast +unless you are going to define the layout with {@link android.widget.Toast#setView(View)}. +If you do not have a custom layout to use, you must use +{@link android.widget.Toast#makeText(Context,int,int)} to create the Toast.
+ diff --git a/docs/html/images/custom_message.png b/docs/html/images/custom_message.png new file mode 100755 index 0000000..ea7c716 Binary files /dev/null and b/docs/html/images/custom_message.png differ diff --git a/docs/html/images/custom_toast.png b/docs/html/images/custom_toast.png new file mode 100755 index 0000000..230625a Binary files /dev/null and b/docs/html/images/custom_toast.png differ diff --git a/docs/html/images/notifications_window.png b/docs/html/images/notifications_window.png new file mode 100755 index 0000000..78e0c8a Binary files /dev/null and b/docs/html/images/notifications_window.png differ diff --git a/docs/html/images/status_bar.png b/docs/html/images/status_bar.png new file mode 100755 index 0000000..420bb03 Binary files /dev/null and b/docs/html/images/status_bar.png differ diff --git a/docs/html/images/toast.png b/docs/html/images/toast.png new file mode 100644 index 0000000..223048a Binary files /dev/null and b/docs/html/images/toast.png differ -- cgit v1.1