All kinds of little foreground services fixes.
- Better explanations of some strings.
- Fix to use the right package when an item is pressed in
the foreground services dialog.
- Improve java docs on Service.startForeground().
Bug: 37925387
735566 lv - Android - [Source] Context unclear or missing:
Apps running in background
Bug: 37925888
735566 lv - Android - [Source] Context unclear or missing:
Tap for details on battery and data usage
Bug: 37897953
735566 gl - Android - [Source] Context unclear or missing:
LEFT_SIDE, RIGHT_SIDE
Bug: 37943079
Music is dying mid playback
Test: manual
Change-Id: Ied41932c61f59335bd18dfba3fcb13af28a0bddd
diff --git a/core/java/android/app/Service.java b/core/java/android/app/Service.java
index 0265ea5..10d6a7b 100644
--- a/core/java/android/app/Service.java
+++ b/core/java/android/app/Service.java
@@ -671,22 +671,22 @@
}
/**
- * Make this service run in the foreground, supplying the ongoing
+ * If your service is started (running through {@link Context#startService(Intent)}), then
+ * also make this service run in the foreground, supplying the ongoing
* notification to be shown to the user while in this state.
- * By default services are background, meaning that if the system needs to
- * kill them to reclaim more memory (such as to display a large page in a
- * web browser), they can be killed without too much harm. You can set this
- * flag if killing your service would be disruptive to the user, such as
+ * By default started services are background, meaning that their process won't be given
+ * foreground CPU scheduling (unless something else in that process is foreground) and,
+ * if the system needs to kill them to reclaim more memory (such as to display a large page in a
+ * web browser), they can be killed without too much harm. You use
+ * {@link #startForeground} if killing your service would be disruptive to the user, such as
* if your service is performing background music playback, so the user
* would notice if their music stopped playing.
- *
- * <p>If you need your application to run on platform versions prior to API
- * level 5, you can use the following model to call the the older setForeground()
- * or this modern method as appropriate:
- *
- * {@sample development/samples/ApiDemos/src/com/example/android/apis/app/ForegroundService.java
- * foreground_compatibility}
- *
+ *
+ * <p>Note that calling this method does <em>not</em> put the service in the started state
+ * itself, even though the name sounds like it. You must always call
+ * {@link #startService(Intent)} first to tell the system it should keep the service running,
+ * and then use this method to tell it to keep it running harder.</p>
+ *
* @param id The identifier for this notification as per
* {@link NotificationManager#notify(int, Notification)
* NotificationManager.notify(int, Notification)}; must not be 0.
@@ -716,7 +716,9 @@
/**
* Remove this service from foreground state, allowing it to be killed if
- * more memory is needed.
+ * more memory is needed. This does not stop the service from running (for that
+ * you use {@link #stopSelf()} or related methods), just takes it out of the
+ * foreground state.
*
* @param flags additional behavior options.
* @see #startForeground(int, Notification)
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index e633d66..31acd0f 100644
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -644,8 +644,10 @@
<!-- Text shown when viewing channel settings for notifications related to a usb connection -->
<string name="notification_channel_usb">USB connection</string>
- <!-- Text shown when viewing channel settings for notifications related to running foreground
- services [CHAR LIMIT=NONE] -->
+ <!-- This is the label for the notification channel settings that controls the behavior
+ of the notification about applications that are running in the background (that is,
+ perhaps confusingly, running foreground services but not the foreground UI on the screen).
+ [CHAR LIMIT=NONE] -->
<string name="notification_channel_foreground_service">Apps running in background</string>
<!-- Label for foreground service notification when one app is running. [CHAR LIMIT=NONE] -->
@@ -663,7 +665,10 @@
data usage</string>
<!-- Separator for foreground service notification content listing all apps when there
- are multiple apps running [CHAR LIMIT=NONE] -->
+ are multiple apps running. The left and right side may both already be compound
+ (constructed using this separator). Should be kept as short as possible, this is
+ for summary text in the notification where there is not a lot of space.
+ [CHAR LIMIT=NONE] -->
<string name="foreground_service_multiple_separator"><xliff:g id="left_side">%1$s</xliff:g>,
<xliff:g id="right_side">%2$s</xliff:g></string>
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index bf70c5a..d15fcae 100644
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -2033,7 +2033,9 @@
<!-- Title of the "running foreground services" dialog. [CHAR LIMIT=NONE] -->
<string name="running_foreground_services_title">Apps running in background</string>
- <!-- Title of the "running foreground services" dialog. [CHAR LIMIT=NONE] -->
+ <!-- Descriptive text of an item in the "running foreground services" dialog, telling the
+ user what will happen when they tap on that item (which is an application that has
+ been identified for them as running). [CHAR LIMIT=NONE] -->
<string name="running_foreground_services_msg">Tap for details on battery and data usage</string>
</resources>
diff --git a/packages/SystemUI/src/com/android/systemui/ForegroundServicesDialog.java b/packages/SystemUI/src/com/android/systemui/ForegroundServicesDialog.java
index 49e780c..9d286cf 100644
--- a/packages/SystemUI/src/com/android/systemui/ForegroundServicesDialog.java
+++ b/packages/SystemUI/src/com/android/systemui/ForegroundServicesDialog.java
@@ -66,7 +66,7 @@
private DialogInterface.OnClickListener mAppClickListener =
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
- String pkg = mPackages[which];
+ String pkg = mAdapter.getItem(which).packageName;
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
intent.setData(Uri.fromParts("package", pkg, null));
startActivity(intent);