The file containing the source code shown below is located in the corresponding directory in <sdk>/samples/android-<version>/...
/* * Copyright (C) 2007 The Android开源工程 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.example.android.apis.app; import com.example.android.apis.R; import android.app.Activity; import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; import android.content.ComponentName; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.RemoteViews; /** * Demonstrates adding notifications to the status bar */ public class StatusBarNotifications extends Activity { private NotificationManager mNotificationManager; // Use our layout id for a unique identifier private static int MOOD_NOTIFICATIONS = R.layout.status_bar_notifications; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.status_bar_notifications); Button button; // Get the notification manager serivce. mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); button = (Button) findViewById(R.id.happy); button.setOnClickListener(new Button.OnClickListener() { public void onClick(View v) { setMood(R.drawable.stat_happy, R.string.status_bar_notifications_happy_message, false); } }); button = (Button) findViewById(R.id.neutral); button.setOnClickListener(new Button.OnClickListener() { public void onClick(View v) { setMood(R.drawable.stat_neutral, R.string.status_bar_notifications_ok_message, false); } }); button = (Button) findViewById(R.id.sad); button.setOnClickListener(new Button.OnClickListener() { public void onClick(View v) { setMood(R.drawable.stat_sad, R.string.status_bar_notifications_sad_message, false); } }); button = (Button) findViewById(R.id.happyMarquee); button.setOnClickListener(new Button.OnClickListener() { public void onClick(View v) { setMood(R.drawable.stat_happy, R.string.status_bar_notifications_happy_message, true); } }); button = (Button) findViewById(R.id.neutralMarquee); button.setOnClickListener(new Button.OnClickListener() { public void onClick(View v) { setMood(R.drawable.stat_neutral, R.string.status_bar_notifications_ok_message, true); } }); button = (Button) findViewById(R.id.sadMarquee); button.setOnClickListener(new Button.OnClickListener() { public void onClick(View v) { setMood(R.drawable.stat_sad, R.string.status_bar_notifications_sad_message, true); } }); button = (Button) findViewById(R.id.happyViews); button.setOnClickListener(new Button.OnClickListener() { public void onClick(View v) { setMoodView(R.drawable.stat_happy, R.string.status_bar_notifications_happy_message); } }); button = (Button) findViewById(R.id.neutralViews); button.setOnClickListener(new Button.OnClickListener() { public void onClick(View v) { setMoodView(R.drawable.stat_neutral, R.string.status_bar_notifications_ok_message); } }); button = (Button) findViewById(R.id.sadViews); button.setOnClickListener(new Button.OnClickListener() { public void onClick(View v) { setMoodView(R.drawable.stat_sad, R.string.status_bar_notifications_sad_message); } }); button = (Button) findViewById(R.id.defaultSound); button.setOnClickListener(new Button.OnClickListener() { public void onClick(View v) { setDefault(Notification.DEFAULT_SOUND); } }); button = (Button) findViewById(R.id.defaultVibrate); button.setOnClickListener(new Button.OnClickListener() { public void onClick(View v) { setDefault(Notification.DEFAULT_VIBRATE); } }); button = (Button) findViewById(R.id.defaultAll); button.setOnClickListener(new Button.OnClickListener() { public void onClick(View v) { setDefault(Notification.DEFAULT_ALL); } }); button = (Button) findViewById(R.id.clear); button.setOnClickListener(new Button.OnClickListener() { public void onClick(View v) { mNotificationManager.cancel(R.layout.status_bar_notifications); } }); } private PendingIntent makeMoodIntent(int moodId) { // The PendingIntent to launch our activity if the user selects this // notification. Note the use of FLAG_UPDATE_CURRENT so that if there // is already an active matching pending intent, we will update its // extras (and other Intents in the array) to be the ones passed in here. PendingIntent contentIntent = PendingIntent.getActivity(this, 0, new Intent(this, NotificationDisplay.class).putExtra("moodimg", moodId), PendingIntent.FLAG_UPDATE_CURRENT); return contentIntent; } private PendingIntent makeDefaultIntent() { // A typical convention for notifications is to launch the user deeply // into an application representing the data in the notification; to // accomplish this, we can build an array of intents to insert the back // stack stack history above the item being displayed. Intent[] intents = new Intent[4]; // First: root activity of ApiDemos. // This is a convenient way to make the proper Intent to launch and // reset an application's task. intents[0] = Intent.makeRestartActivityTask(new ComponentName(this, com.example.android.apis.ApiDemos.class)); // "App" intents[1] = new Intent(this, com.example.android.apis.ApiDemos.class); intents[1].putExtra("com.example.android.apis.Path", "App"); // "App/Notification" intents[2] = new Intent(this, com.example.android.apis.ApiDemos.class); intents[2].putExtra("com.example.android.apis.Path", "App/Notification"); // Now the activity to display to the user. intents[3] = new Intent(this, StatusBarNotifications.class); // The PendingIntent to launch our activity if the user selects this // notification. Note the use of FLAG_UPDATE_CURRENT so that if there // is already an active matching pending intent, we will update its // extras (and other Intents in the array) to be the ones passed in here. PendingIntent contentIntent = PendingIntent.getActivities(this, 0, intents, PendingIntent.FLAG_UPDATE_CURRENT); return contentIntent; } private void setMood(int moodId, int textId, boolean showTicker) { // In this sample, we'll use the same text for the ticker and the expanded notification CharSequence text = getText(textId); // choose the ticker text String tickerText = showTicker ? getString(textId) : null; // Set the icon, scrolling text and timestamp Notification notification = new Notification(moodId, tickerText, System.currentTimeMillis()); // Set the info for the views that show in the notification panel. notification.setLatestEventInfo(this, getText(R.string.status_bar_notifications_mood_title), text, makeMoodIntent(moodId)); // Send the notification. // We use a layout id because it is a unique number. We use it later to cancel. mNotificationManager.notify(MOOD_NOTIFICATIONS, notification); } private void setMoodView(int moodId, int textId) { // Instead of the normal constructor, we're going to use the one with no args and fill // in all of the data ourselves. The normal one uses the default layout for notifications. // You probably want that in most cases, but if you want to do something custom, you // can set the contentView field to your own RemoteViews object. Notification notif = new Notification(); // This is who should be launched if the user selects our notification. notif.contentIntent = makeMoodIntent(moodId); // In this sample, we'll use the same text for the ticker and the expanded notification CharSequence text = getText(textId); notif.tickerText = text; // the icon for the status bar notif.icon = moodId; // our custom view RemoteViews contentView = new RemoteViews(getPackageName(), R.layout.status_bar_balloon); contentView.setTextViewText(R.id.text, text); contentView.setImageViewResource(R.id.icon, moodId); notif.contentView = contentView; // we use a string id because is a unique number. we use it later to cancel the // notification mNotificationManager.notify(MOOD_NOTIFICATIONS, notif); } private void setDefault(int defaults) { // This method sets the defaults on the notification before posting it. // This is who should be launched if the user selects our notification. PendingIntent contentIntent = makeDefaultIntent(); // In this sample, we'll use the same text for the ticker and the expanded notification CharSequence text = getText(R.string.status_bar_notifications_happy_message); final Notification notification = new Notification( R.drawable.stat_happy, // the icon for the status bar text, // the text to display in the ticker System.currentTimeMillis()); // the timestamp for the notification notification.setLatestEventInfo( this, // the context to use getText(R.string.status_bar_notifications_mood_title), // the title for the notification text, // the details to display in the notification contentIntent); // the contentIntent (see above) notification.defaults = defaults; mNotificationManager.notify( MOOD_NOTIFICATIONS, // we use a string id because it is a unique // number. we use it later to cancel the notification notification); } }