ServiceRecord.java revision 2ced96c54445efca6522afd1878f79c9ee2780ba
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage com.android.server.am; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 192ced96c54445efca6522afd1878f79c9ee2780baDianne Hackbornimport android.app.PendingIntent; 202ced96c54445efca6522afd1878f79c9ee2780baDianne Hackbornimport android.net.Uri; 212ced96c54445efca6522afd1878f79c9ee2780baDianne Hackbornimport android.provider.Settings; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.internal.os.BatteryStatsImpl; 23d0a2f86f357f346639a6648b4004266865c979b4Daniel Sandlerimport com.android.server.NotificationManagerService; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackbornimport android.app.INotificationManager; 26d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackbornimport android.app.Notification; 27d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackbornimport android.app.NotificationManager; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ComponentName; 290c3804950236fe170ebf6cc7a5f1e3e305b8f315Dianne Hackbornimport android.content.Context; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Intent; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.ApplicationInfo; 32742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasaniimport android.content.pm.PackageManager; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.ServiceInfo; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Binder; 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IBinder; 36d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackbornimport android.os.RemoteException; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.SystemClock; 38f02b60aa4f367516f40cf3d60fffae0c6fe3e1b8Dianne Hackbornimport android.os.UserHandle; 398a9b22056b13477f59df934928c00c58b5871c95Joe Onoratoimport android.util.Slog; 401ebccf531d1049853b3b0630035434619682c016Dianne Hackbornimport android.util.TimeUtils; 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.PrintWriter; 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList; 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.HashMap; 4539792d2262352ae775091876d5488d2412a2ff92Dianne Hackbornimport java.util.HashSet; 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Iterator; 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.List; 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A running application service. 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass ServiceRecord extends Binder { 5339792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn // Maximum number of delivery attempts before giving up. 5439792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn static final int MAX_DELIVERY_COUNT = 3; 5539792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn 5639792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn // Maximum number of times it can fail during execution before giving up. 5739792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn static final int MAX_DONE_EXECUTING_COUNT = 6; 5839792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn 59b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn final ActivityManagerService ams; 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final BatteryStatsImpl.Uid.Pkg.Serv stats; 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ComponentName name; // service component. 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final String shortName; // name.flattenToShortString(). 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Intent.FilterComparison intent; 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // original intent used to find service. 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ServiceInfo serviceInfo; 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // all information about the service. 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ApplicationInfo appInfo; 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // information about service's app. 69742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani final int userId; // user that this service is running as 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final String packageName; // the package implementing intent's component 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final String processName; // process where this component wants to run 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final String permission;// permission needed to access service 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final String baseDir; // where activity source (resources etc) located 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final String resDir; // where public activity source (public resources etc) located 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final String dataDir; // where activity data should go 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final boolean exported; // from ServiceInfo.exported 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Runnable restarter; // used to schedule retries of starting the service 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long createTime; // when this service was created 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final HashMap<Intent.FilterComparison, IntentBindRecord> bindings 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project = new HashMap<Intent.FilterComparison, IntentBindRecord>(); 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // All active bindings to the service. 8243d9ac81f7722bb539ee67023f10b9f43abbf202Dianne Hackborn final HashMap<IBinder, ArrayList<ConnectionRecord>> connections 8343d9ac81f7722bb539ee67023f10b9f43abbf202Dianne Hackborn = new HashMap<IBinder, ArrayList<ConnectionRecord>>(); 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // IBinder -> ConnectionRecord of all bound clients 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 86d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn ProcessRecord app; // where this service is running or null. 87a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn ProcessRecord isolatedProc; // keep track of isolated process, if requested 88d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn boolean isForeground; // is service currently in foreground mode? 89d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn int foregroundId; // Notification ID of last foreground req. 90d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn Notification foregroundNoti; // Notification record of foreground state. 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long lastActivity; // last time there was some activity on the service. 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean startRequested; // someone explicitly called start? 93f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn boolean stopIfKilled; // last onStart() said to stop if service killed? 94f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn boolean callStart; // last onStart() has asked to alway be called on restart. 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int executeNesting; // number of outstanding operations keeping foreground. 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long executingStart; // start time of last execute request. 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int crashCount; // number of times proc has crashed with service running 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int totalRestartCount; // number of times we have had to restart. 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int restartCount; // number of restarts performed in a row. 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long restartDelay; // delay until next restart attempt. 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long restartTime; // time of last restart. 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long nextRestartTime; // time when restartDelay will expire. 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 104f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn String stringName; // caching of toString 105f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn 1060c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn private int lastStartId; // identifier of most recent start request. 1070c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn 1087e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn static class StartItem { 10939792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn final ServiceRecord sr; 1100c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn final boolean taskRemoved; 11139792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn final int id; 11239792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn final Intent intent; 11321c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn final ActivityManagerService.NeededUriGrants neededGrants; 11439792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn long deliveredTime; 11539792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn int deliveryCount; 11639792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn int doneExecutingCount; 1177e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn UriPermissionOwner uriPermissions; 11839792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn 11939792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn String stringName; // caching of toString 12039792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn 1210c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn StartItem(ServiceRecord _sr, boolean _taskRemoved, int _id, Intent _intent, 12221c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn ActivityManagerService.NeededUriGrants _neededGrants) { 12339792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn sr = _sr; 1240c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn taskRemoved = _taskRemoved; 12539792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn id = _id; 12639792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn intent = _intent; 12721c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn neededGrants = _neededGrants; 12839792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn } 12939792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn 1307e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn UriPermissionOwner getUriPermissionsLocked() { 1317e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn if (uriPermissions == null) { 1327e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn uriPermissions = new UriPermissionOwner(sr.ams, this); 13339792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn } 1347e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn return uriPermissions; 13539792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn } 13639792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn 1377e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn void removeUriPermissionsLocked() { 1387e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn if (uriPermissions != null) { 1397e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn uriPermissions.removeUriPermissionsLocked(); 1407e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn uriPermissions = null; 14139792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn } 14239792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn } 14339792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn 14439792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn public String toString() { 14539792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn if (stringName != null) { 14639792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn return stringName; 14739792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn } 14839792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn StringBuilder sb = new StringBuilder(128); 14939792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn sb.append("ServiceRecord{") 15039792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn .append(Integer.toHexString(System.identityHashCode(sr))) 15139792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn .append(' ').append(sr.shortName) 15239792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn .append(" StartItem ") 15339792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn .append(Integer.toHexString(System.identityHashCode(this))) 15439792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn .append(" id=").append(id).append('}'); 15539792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn return stringName = sb.toString(); 15639792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn } 15739792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn } 15839792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn 15939792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn final ArrayList<StartItem> deliveredStarts = new ArrayList<StartItem>(); 16039792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn // start() arguments which been delivered. 16139792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn final ArrayList<StartItem> pendingStarts = new ArrayList<StartItem>(); 16239792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn // start() arguments that haven't yet been delivered. 16339792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn 164f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn void dumpStartList(PrintWriter pw, String prefix, List<StartItem> list, long now) { 165f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn final int N = list.size(); 166f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn for (int i=0; i<N; i++) { 167f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn StartItem si = list.get(i); 168f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn pw.print(prefix); pw.print("#"); pw.print(i); 169f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn pw.print(" id="); pw.print(si.id); 1701ebccf531d1049853b3b0630035434619682c016Dianne Hackborn if (now != 0) { 1711ebccf531d1049853b3b0630035434619682c016Dianne Hackborn pw.print(" dur="); 1721ebccf531d1049853b3b0630035434619682c016Dianne Hackborn TimeUtils.formatDuration(si.deliveredTime, now, pw); 1731ebccf531d1049853b3b0630035434619682c016Dianne Hackborn } 174f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn if (si.deliveryCount != 0) { 175f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn pw.print(" dc="); pw.print(si.deliveryCount); 176f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn } 177f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn if (si.doneExecutingCount != 0) { 178f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn pw.print(" dxc="); pw.print(si.doneExecutingCount); 179f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn } 18039792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn pw.println(""); 18139792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn pw.print(prefix); pw.print(" intent="); 182f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn if (si.intent != null) pw.println(si.intent.toString()); 183f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn else pw.println("null"); 18421c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn if (si.neededGrants != null) { 18521c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn pw.print(prefix); pw.print(" neededGrants="); 18621c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn pw.println(si.neededGrants); 18739792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn } 1887e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn if (si.uriPermissions != null) { 1897e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn if (si.uriPermissions.readUriPermissions != null) { 1907e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn pw.print(prefix); pw.print(" readUriPermissions="); 1917e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn pw.println(si.uriPermissions.readUriPermissions); 1927e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn } 1937e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn if (si.uriPermissions.writeUriPermissions != null) { 1947e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn pw.print(prefix); pw.print(" writeUriPermissions="); 1957e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn pw.println(si.uriPermissions.writeUriPermissions); 1967e269644fcc319835f1e7f762f3cbd8087e3e22fDianne Hackborn } 19739792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn } 198f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn } 199f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn } 200f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void dump(PrintWriter pw, String prefix) { 2021d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(prefix); pw.print("intent={"); 20321c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn pw.print(intent.getIntent().toShortString(false, true, false, true)); 2041d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.println('}'); 2051d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(prefix); pw.print("packageName="); pw.println(packageName); 2061d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(prefix); pw.print("processName="); pw.println(processName); 2071d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (permission != null) { 2081d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(prefix); pw.print("permission="); pw.println(permission); 2091d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 210fd12af4e768fec852c4c5dfee3b9bd7403b4b347Dianne Hackborn long now = SystemClock.uptimeMillis(); 2111ebccf531d1049853b3b0630035434619682c016Dianne Hackborn long nowReal = SystemClock.elapsedRealtime(); 2121ebccf531d1049853b3b0630035434619682c016Dianne Hackborn pw.print(prefix); pw.print("baseDir="); pw.println(baseDir); 213a301fe61c8573c06be754d5788a84d19188ee2d3Marco Nelissen if (!resDir.equals(baseDir)) { 214a301fe61c8573c06be754d5788a84d19188ee2d3Marco Nelissen pw.print(prefix); pw.print("resDir="); pw.println(resDir); 215a301fe61c8573c06be754d5788a84d19188ee2d3Marco Nelissen } 2161ebccf531d1049853b3b0630035434619682c016Dianne Hackborn pw.print(prefix); pw.print("dataDir="); pw.println(dataDir); 2171d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(prefix); pw.print("app="); pw.println(app); 218a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn if (isolatedProc != null) { 219a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn pw.print(prefix); pw.print("isolatedProc="); pw.println(isolatedProc); 220a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn } 221d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn if (isForeground || foregroundId != 0) { 222d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn pw.print(prefix); pw.print("isForeground="); pw.print(isForeground); 223d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn pw.print(" foregroundId="); pw.print(foregroundId); 224d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn pw.print(" foregroundNoti="); pw.println(foregroundNoti); 225d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn } 2269adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn pw.print(prefix); pw.print("createTime="); 2271ebccf531d1049853b3b0630035434619682c016Dianne Hackborn TimeUtils.formatDuration(createTime, nowReal, pw); 2281ebccf531d1049853b3b0630035434619682c016Dianne Hackborn pw.print(" lastActivity="); 2291ebccf531d1049853b3b0630035434619682c016Dianne Hackborn TimeUtils.formatDuration(lastActivity, now, pw); 2301ebccf531d1049853b3b0630035434619682c016Dianne Hackborn pw.println(""); 231e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn pw.print(prefix); pw.print("executingStart="); 2321ebccf531d1049853b3b0630035434619682c016Dianne Hackborn TimeUtils.formatDuration(executingStart, now, pw); 2331ebccf531d1049853b3b0630035434619682c016Dianne Hackborn pw.print(" restartTime="); 2341ebccf531d1049853b3b0630035434619682c016Dianne Hackborn TimeUtils.formatDuration(restartTime, now, pw); 2351ebccf531d1049853b3b0630035434619682c016Dianne Hackborn pw.println(""); 236d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn if (startRequested || lastStartId != 0) { 237d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn pw.print(prefix); pw.print("startRequested="); pw.print(startRequested); 238f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn pw.print(" stopIfKilled="); pw.print(stopIfKilled); 239f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn pw.print(" callStart="); pw.print(callStart); 240d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn pw.print(" lastStartId="); pw.println(lastStartId); 241d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn } 242d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn if (executeNesting != 0 || crashCount != 0 || restartCount != 0 243d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn || restartDelay != 0 || nextRestartTime != 0) { 244d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn pw.print(prefix); pw.print("executeNesting="); pw.print(executeNesting); 245d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn pw.print(" restartCount="); pw.print(restartCount); 2461ebccf531d1049853b3b0630035434619682c016Dianne Hackborn pw.print(" restartDelay="); 2471ebccf531d1049853b3b0630035434619682c016Dianne Hackborn TimeUtils.formatDuration(restartDelay, now, pw); 2481ebccf531d1049853b3b0630035434619682c016Dianne Hackborn pw.print(" nextRestartTime="); 2491ebccf531d1049853b3b0630035434619682c016Dianne Hackborn TimeUtils.formatDuration(nextRestartTime, now, pw); 250d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn pw.print(" crashCount="); pw.println(crashCount); 251d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn } 252f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn if (deliveredStarts.size() > 0) { 253f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn pw.print(prefix); pw.println("Delivered Starts:"); 2541ebccf531d1049853b3b0630035434619682c016Dianne Hackborn dumpStartList(pw, prefix, deliveredStarts, now); 255f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn } 256f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn if (pendingStarts.size() > 0) { 257f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn pw.print(prefix); pw.println("Pending Starts:"); 258f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn dumpStartList(pw, prefix, pendingStarts, 0); 259f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn } 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (bindings.size() > 0) { 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Iterator<IntentBindRecord> it = bindings.values().iterator(); 262f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn pw.print(prefix); pw.println("Bindings:"); 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (it.hasNext()) { 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IntentBindRecord b = it.next(); 2651d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(prefix); pw.print("* IntentBindRecord{"); 2661d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(Integer.toHexString(System.identityHashCode(b))); 2670c3804950236fe170ebf6cc7a5f1e3e305b8f315Dianne Hackborn if ((b.collectFlags()&Context.BIND_AUTO_CREATE) != 0) { 2680c3804950236fe170ebf6cc7a5f1e3e305b8f315Dianne Hackborn pw.append(" CREATE"); 2690c3804950236fe170ebf6cc7a5f1e3e305b8f315Dianne Hackborn } 2701d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.println("}:"); 2711d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn b.dumpInService(pw, prefix + " "); 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (connections.size() > 0) { 2751d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(prefix); pw.println("All Connections:"); 27643d9ac81f7722bb539ee67023f10b9f43abbf202Dianne Hackborn Iterator<ArrayList<ConnectionRecord>> it = connections.values().iterator(); 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (it.hasNext()) { 27843d9ac81f7722bb539ee67023f10b9f43abbf202Dianne Hackborn ArrayList<ConnectionRecord> c = it.next(); 27943d9ac81f7722bb539ee67023f10b9f43abbf202Dianne Hackborn for (int i=0; i<c.size(); i++) { 28043d9ac81f7722bb539ee67023f10b9f43abbf202Dianne Hackborn pw.print(prefix); pw.print(" "); pw.println(c.get(i)); 28143d9ac81f7722bb539ee67023f10b9f43abbf202Dianne Hackborn } 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 286b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn ServiceRecord(ActivityManagerService ams, 287b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn BatteryStatsImpl.Uid.Pkg.Serv servStats, ComponentName name, 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Intent.FilterComparison intent, ServiceInfo sInfo, Runnable restarter) { 289b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn this.ams = ams; 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.stats = servStats; 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.name = name; 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project shortName = name.flattenToShortString(); 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.intent = intent; 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project serviceInfo = sInfo; 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project appInfo = sInfo.applicationInfo; 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project packageName = sInfo.applicationInfo.packageName; 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project processName = sInfo.processName; 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project permission = sInfo.permission; 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project baseDir = sInfo.applicationInfo.sourceDir; 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project resDir = sInfo.applicationInfo.publicSourceDir; 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dataDir = sInfo.applicationInfo.dataDir; 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project exported = sInfo.exported; 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.restarter = restarter; 3049adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn createTime = SystemClock.elapsedRealtime(); 3059adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn lastActivity = SystemClock.uptimeMillis(); 306f02b60aa4f367516f40cf3d60fffae0c6fe3e1b8Dianne Hackborn userId = UserHandle.getUserId(appInfo.uid); 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public AppBindRecord retrieveAppBindingLocked(Intent intent, 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ProcessRecord app) { 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Intent.FilterComparison filter = new Intent.FilterComparison(intent); 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IntentBindRecord i = bindings.get(filter); 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (i == null) { 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i = new IntentBindRecord(this, filter); 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bindings.put(filter, i); 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AppBindRecord a = i.apps.get(app); 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (a != null) { 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return a; 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a = new AppBindRecord(this, i, app); 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i.apps.put(app, a); 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return a; 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void resetRestartCounter() { 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project restartCount = 0; 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project restartDelay = 0; 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project restartTime = 0; 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 332f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn public StartItem findDeliveredStart(int id, boolean remove) { 333f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn final int N = deliveredStarts.size(); 334f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn for (int i=0; i<N; i++) { 335f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn StartItem si = deliveredStarts.get(i); 336f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn if (si.id == id) { 337f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn if (remove) deliveredStarts.remove(i); 338f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn return si; 339f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn } 340f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn } 341f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn 342f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn return null; 343f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn } 344f6f9f2d0256930ce0bb4913b2260b8480914edc2Dianne Hackborn 3450c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn public int getLastStartId() { 3460c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn return lastStartId; 3470c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 3480c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn 3490c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn public int makeNextStartId() { 3500c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn lastStartId++; 3510c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn if (lastStartId < 1) { 3520c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn lastStartId = 1; 3530c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 3540c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn return lastStartId; 3550c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 3560c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn 357d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn public void postNotification() { 358d0a2f86f357f346639a6648b4004266865c979b4Daniel Sandler final int appUid = appInfo.uid; 359d0a2f86f357f346639a6648b4004266865c979b4Daniel Sandler final int appPid = app.pid; 360d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn if (foregroundId != 0 && foregroundNoti != null) { 361b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn // Do asynchronous communication with notification manager to 362b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn // avoid deadlocks. 363b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn final String localPackageName = packageName; 364b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn final int localForegroundId = foregroundId; 365b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn final Notification localForegroundNoti = foregroundNoti; 366b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn ams.mHandler.post(new Runnable() { 367b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn public void run() { 368d0a2f86f357f346639a6648b4004266865c979b4Daniel Sandler NotificationManagerService nm = 369d0a2f86f357f346639a6648b4004266865c979b4Daniel Sandler (NotificationManagerService) NotificationManager.getService(); 370d0a2f86f357f346639a6648b4004266865c979b4Daniel Sandler if (nm == null) { 371b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn return; 372b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn } 373b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn try { 374282add7bc3e80825c73244f527857aefa74093a9Dianne Hackborn if (foregroundNoti.icon == 0) { 3752ced96c54445efca6522afd1878f79c9ee2780baDianne Hackborn // It is not correct for the caller to supply a notification 3762ced96c54445efca6522afd1878f79c9ee2780baDianne Hackborn // icon, but this used to be able to slip through, so for 3772ced96c54445efca6522afd1878f79c9ee2780baDianne Hackborn // those dirty apps give it the app's icon. 3782ced96c54445efca6522afd1878f79c9ee2780baDianne Hackborn foregroundNoti.icon = appInfo.icon; 3792ced96c54445efca6522afd1878f79c9ee2780baDianne Hackborn if (foregroundNoti.contentView == null) { 3802ced96c54445efca6522afd1878f79c9ee2780baDianne Hackborn // In this case the app may not have specified a 3812ced96c54445efca6522afd1878f79c9ee2780baDianne Hackborn // content view... so we'll give them something to show. 3822ced96c54445efca6522afd1878f79c9ee2780baDianne Hackborn CharSequence appName = appInfo.loadLabel( 3832ced96c54445efca6522afd1878f79c9ee2780baDianne Hackborn ams.mContext.getPackageManager()); 3842ced96c54445efca6522afd1878f79c9ee2780baDianne Hackborn if (appName == null) { 3852ced96c54445efca6522afd1878f79c9ee2780baDianne Hackborn appName = appInfo.packageName; 3862ced96c54445efca6522afd1878f79c9ee2780baDianne Hackborn } 3872ced96c54445efca6522afd1878f79c9ee2780baDianne Hackborn Context ctx = null; 3882ced96c54445efca6522afd1878f79c9ee2780baDianne Hackborn try { 3892ced96c54445efca6522afd1878f79c9ee2780baDianne Hackborn ctx = ams.mContext.createPackageContext( 3902ced96c54445efca6522afd1878f79c9ee2780baDianne Hackborn appInfo.packageName, 0); 3912ced96c54445efca6522afd1878f79c9ee2780baDianne Hackborn Intent runningIntent = new Intent( 3922ced96c54445efca6522afd1878f79c9ee2780baDianne Hackborn Settings.ACTION_APPLICATION_DETAILS_SETTINGS); 3932ced96c54445efca6522afd1878f79c9ee2780baDianne Hackborn runningIntent.setData(Uri.fromParts("package", 3942ced96c54445efca6522afd1878f79c9ee2780baDianne Hackborn appInfo.packageName, null)); 3952ced96c54445efca6522afd1878f79c9ee2780baDianne Hackborn PendingIntent pi = PendingIntent.getActivity(ams.mContext, 0, 3962ced96c54445efca6522afd1878f79c9ee2780baDianne Hackborn runningIntent, PendingIntent.FLAG_UPDATE_CURRENT); 3972ced96c54445efca6522afd1878f79c9ee2780baDianne Hackborn foregroundNoti.setLatestEventInfo(ctx, 3982ced96c54445efca6522afd1878f79c9ee2780baDianne Hackborn ams.mContext.getString( 3992ced96c54445efca6522afd1878f79c9ee2780baDianne Hackborn com.android.internal.R.string 4002ced96c54445efca6522afd1878f79c9ee2780baDianne Hackborn .app_running_notification_title, 4012ced96c54445efca6522afd1878f79c9ee2780baDianne Hackborn appName), 4022ced96c54445efca6522afd1878f79c9ee2780baDianne Hackborn ams.mContext.getString( 4032ced96c54445efca6522afd1878f79c9ee2780baDianne Hackborn com.android.internal.R.string 4042ced96c54445efca6522afd1878f79c9ee2780baDianne Hackborn .app_running_notification_text, 4052ced96c54445efca6522afd1878f79c9ee2780baDianne Hackborn appName), 4062ced96c54445efca6522afd1878f79c9ee2780baDianne Hackborn pi); 4072ced96c54445efca6522afd1878f79c9ee2780baDianne Hackborn } catch (PackageManager.NameNotFoundException e) { 4082ced96c54445efca6522afd1878f79c9ee2780baDianne Hackborn foregroundNoti.icon = 0; 4092ced96c54445efca6522afd1878f79c9ee2780baDianne Hackborn } 4102ced96c54445efca6522afd1878f79c9ee2780baDianne Hackborn } 4112ced96c54445efca6522afd1878f79c9ee2780baDianne Hackborn } 4122ced96c54445efca6522afd1878f79c9ee2780baDianne Hackborn if (foregroundNoti.icon == 0) { 413282add7bc3e80825c73244f527857aefa74093a9Dianne Hackborn // Notifications whose icon is 0 are defined to not show 414282add7bc3e80825c73244f527857aefa74093a9Dianne Hackborn // a notification, silently ignoring it. We don't want to 415282add7bc3e80825c73244f527857aefa74093a9Dianne Hackborn // just ignore it, we want to prevent the service from 416282add7bc3e80825c73244f527857aefa74093a9Dianne Hackborn // being foreground. 417282add7bc3e80825c73244f527857aefa74093a9Dianne Hackborn throw new RuntimeException("icon must be non-zero"); 418282add7bc3e80825c73244f527857aefa74093a9Dianne Hackborn } 419b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn int[] outId = new int[1]; 420f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn nm.enqueueNotificationInternal(localPackageName, localPackageName, 421f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn appUid, appPid, null, localForegroundId, localForegroundNoti, 422f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn outId, userId); 42334fcf971037f33605e8009946d3acc686819dd6dJoe Onorato } catch (RuntimeException e) { 4248a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(ActivityManagerService.TAG, 4259e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn "Error showing notification for service", e); 4269e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn // If it gave us a garbage notification, it doesn't 4279e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn // get to be foreground. 4289e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn ams.setServiceForeground(name, ServiceRecord.this, 429eaa0718780a29df8fbe42c59beecee5557fdf785Joe Onorato 0, null, true); 430eaa0718780a29df8fbe42c59beecee5557fdf785Joe Onorato ams.crashApplication(appUid, appPid, localPackageName, 431eaa0718780a29df8fbe42c59beecee5557fdf785Joe Onorato "Bad notification for startForeground: " + e); 432b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn } 433d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn } 434b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn }); 435d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn } 436d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn } 437d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn 438d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn public void cancelNotification() { 439d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn if (foregroundId != 0) { 440b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn // Do asynchronous communication with notification manager to 441b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn // avoid deadlocks. 442b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn final String localPackageName = packageName; 443b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn final int localForegroundId = foregroundId; 444b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn ams.mHandler.post(new Runnable() { 445b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn public void run() { 446b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn INotificationManager inm = NotificationManager.getService(); 447b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn if (inm == null) { 448b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn return; 449b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn } 450b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn try { 4514120375d46091df8527bb701882e056fbb0e6b06Dianne Hackborn inm.cancelNotificationWithTag(localPackageName, null, 4524120375d46091df8527bb701882e056fbb0e6b06Dianne Hackborn localForegroundId, userId); 45334fcf971037f33605e8009946d3acc686819dd6dJoe Onorato } catch (RuntimeException e) { 4548a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w(ActivityManagerService.TAG, 4559e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn "Error canceling notification for service", e); 456b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn } catch (RemoteException e) { 457b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn } 458d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn } 459b1c4a2a3b37fccf68e6a9563cccf1685df2bf3e7Dianne Hackborn }); 460d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn } 461d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn } 462d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn 46339792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn public void clearDeliveredStartsLocked() { 46439792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn for (int i=deliveredStarts.size()-1; i>=0; i--) { 46539792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn deliveredStarts.get(i).removeUriPermissionsLocked(); 46639792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn } 46739792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn deliveredStarts.clear(); 46839792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn } 46939792d2262352ae775091876d5488d2412a2ff92Dianne Hackborn 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 471f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn if (stringName != null) { 472f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn return stringName; 473f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn } 474f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn StringBuilder sb = new StringBuilder(128); 4751d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sb.append("ServiceRecord{") 4761d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn .append(Integer.toHexString(System.identityHashCode(this))) 477b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn .append(" u").append(userId) 4781d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn .append(' ').append(shortName).append('}'); 479f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn return stringName = sb.toString(); 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 482