NotificationManager.java revision f265ea9d8307282ff1da3915978625a94fc2859e
1/* 2 * Copyright (C) 2007 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17package android.app; 18 19import android.content.Context; 20import android.os.Handler; 21import android.os.IBinder; 22import android.os.RemoteException; 23import android.os.ServiceManager; 24import android.os.UserHandle; 25import android.util.Log; 26 27/** 28 * Class to notify the user of events that happen. This is how you tell 29 * the user that something has happened in the background. {@more} 30 * 31 * Notifications can take different forms: 32 * <ul> 33 * <li>A persistent icon that goes in the status bar and is accessible 34 * through the launcher, (when the user selects it, a designated Intent 35 * can be launched),</li> 36 * <li>Turning on or flashing LEDs on the device, or</li> 37 * <li>Alerting the user by flashing the backlight, playing a sound, 38 * or vibrating.</li> 39 * </ul> 40 * 41 * <p> 42 * Each of the notify methods takes an int id parameter and optionally a 43 * {@link String} tag parameter, which may be {@code null}. These parameters 44 * are used to form a pair (tag, id), or ({@code null}, id) if tag is 45 * unspecified. This pair identifies this notification from your app to the 46 * system, so that pair should be unique within your app. If you call one 47 * of the notify methods with a (tag, id) pair that is currently active and 48 * a new set of notification parameters, it will be updated. For example, 49 * if you pass a new status bar icon, the old icon in the status bar will 50 * be replaced with the new one. This is also the same tag and id you pass 51 * to the {@link #cancel(int)} or {@link #cancel(String, int)} method to clear 52 * this notification. 53 * 54 * <p> 55 * You do not instantiate this class directly; instead, retrieve it through 56 * {@link android.content.Context#getSystemService}. 57 * 58 * <div class="special reference"> 59 * <h3>Developer Guides</h3> 60 * <p>For a guide to creating notifications, read the 61 * <a href="{@docRoot}guide/topics/ui/notifiers/notifications.html">Status Bar Notifications</a> 62 * developer guide.</p> 63 * </div> 64 * 65 * @see android.app.Notification 66 * @see android.content.Context#getSystemService 67 */ 68public class NotificationManager 69{ 70 private static String TAG = "NotificationManager"; 71 private static boolean localLOGV = false; 72 73 private static INotificationManager sService; 74 75 /** @hide */ 76 static public INotificationManager getService() 77 { 78 if (sService != null) { 79 return sService; 80 } 81 IBinder b = ServiceManager.getService("notification"); 82 sService = INotificationManager.Stub.asInterface(b); 83 return sService; 84 } 85 86 /*package*/ NotificationManager(Context context, Handler handler) 87 { 88 mContext = context; 89 } 90 91 /** {@hide} */ 92 public static NotificationManager from(Context context) { 93 return (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); 94 } 95 96 /** 97 * Post a notification to be shown in the status bar. If a notification with 98 * the same id has already been posted by your application and has not yet been canceled, it 99 * will be replaced by the updated information. 100 * 101 * @param id An identifier for this notification unique within your 102 * application. 103 * @param notification A {@link Notification} object describing what to show the user. Must not 104 * be null. 105 */ 106 public void notify(int id, Notification notification) 107 { 108 notify(null, id, notification); 109 } 110 111 /** 112 * Post a notification to be shown in the status bar. If a notification with 113 * the same tag and id has already been posted by your application and has not yet been 114 * canceled, it will be replaced by the updated information. 115 * 116 * @param tag A string identifier for this notification. May be {@code null}. 117 * @param id An identifier for this notification. The pair (tag, id) must be unique 118 * within your application. 119 * @param notification A {@link Notification} object describing what to 120 * show the user. Must not be null. 121 */ 122 public void notify(String tag, int id, Notification notification) 123 { 124 int[] idOut = new int[1]; 125 INotificationManager service = getService(); 126 String pkg = mContext.getPackageName(); 127 if (notification.sound != null) { 128 notification.sound = notification.sound.getCanonicalUri(); 129 } 130 if (localLOGV) Log.v(TAG, pkg + ": notify(" + id + ", " + notification + ")"); 131 try { 132 service.enqueueNotificationWithTag(pkg, mContext.getBasePackageName(), tag, id, 133 notification, idOut, UserHandle.myUserId()); 134 if (id != idOut[0]) { 135 Log.w(TAG, "notify: id corrupted: sent " + id + ", got back " + idOut[0]); 136 } 137 } catch (RemoteException e) { 138 } 139 } 140 141 /** 142 * @hide 143 */ 144 public void notifyAsUser(String tag, int id, Notification notification, UserHandle user) 145 { 146 int[] idOut = new int[1]; 147 INotificationManager service = getService(); 148 String pkg = mContext.getPackageName(); 149 if (notification.sound != null) { 150 notification.sound = notification.sound.getCanonicalUri(); 151 } 152 if (localLOGV) Log.v(TAG, pkg + ": notify(" + id + ", " + notification + ")"); 153 try { 154 service.enqueueNotificationWithTag(pkg, mContext.getBasePackageName(), tag, id, 155 notification, idOut, user.getIdentifier()); 156 if (id != idOut[0]) { 157 Log.w(TAG, "notify: id corrupted: sent " + id + ", got back " + idOut[0]); 158 } 159 } catch (RemoteException e) { 160 } 161 } 162 163 /** 164 * Cancel a previously shown notification. If it's transient, the view 165 * will be hidden. If it's persistent, it will be removed from the status 166 * bar. 167 */ 168 public void cancel(int id) 169 { 170 cancel(null, id); 171 } 172 173 /** 174 * Cancel a previously shown notification. If it's transient, the view 175 * will be hidden. If it's persistent, it will be removed from the status 176 * bar. 177 */ 178 public void cancel(String tag, int id) 179 { 180 INotificationManager service = getService(); 181 String pkg = mContext.getPackageName(); 182 if (localLOGV) Log.v(TAG, pkg + ": cancel(" + id + ")"); 183 try { 184 service.cancelNotificationWithTag(pkg, tag, id, UserHandle.myUserId()); 185 } catch (RemoteException e) { 186 } 187 } 188 189 /** 190 * @hide 191 */ 192 public void cancelAsUser(String tag, int id, UserHandle user) 193 { 194 INotificationManager service = getService(); 195 String pkg = mContext.getPackageName(); 196 if (localLOGV) Log.v(TAG, pkg + ": cancel(" + id + ")"); 197 try { 198 service.cancelNotificationWithTag(pkg, tag, id, user.getIdentifier()); 199 } catch (RemoteException e) { 200 } 201 } 202 203 /** 204 * Cancel all previously shown notifications. See {@link #cancel} for the 205 * detailed behavior. 206 */ 207 public void cancelAll() 208 { 209 INotificationManager service = getService(); 210 String pkg = mContext.getPackageName(); 211 if (localLOGV) Log.v(TAG, pkg + ": cancelAll()"); 212 try { 213 service.cancelAllNotifications(pkg, UserHandle.myUserId()); 214 } catch (RemoteException e) { 215 } 216 } 217 218 private Context mContext; 219} 220