Updating the Progress Bar in the Notification Area
There are several threads already on how to make custom layouts in the notification bar. The problem is I must be missing something simple.
I have a custom_notification_layout.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:padding="3dip"
>
<TextView android:id="@+id/text"
android:text="Uploading"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#000"
/>
<ProgressBar
style="?android:attr/progressBarStyleHorizontal"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:max="0"
android:progress="0"
开发者_开发百科 android:layout_marginLeft="10dip"
android:id="@+id/progressBar"
/>
</LinearLayout>
I also have some test code that creates the notification, which works and shows the progress bar.
NotificationManager mManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
Notification notification = new Notification(R.drawable.icon, title, System.currentTimeMillis());
RemoteViews contentView = new RemoteViews(context.getPackageName(), R.layout.custom_notification_layout);
contentView.setProgressBar(R.id.progressBar, 10, 0, false);
contentView.setTextViewText(R.id.text, text);
notification.contentView = contentView;
Intent notificationIntent = new Intent(context, NotificationHandler.class);
PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0);
notification.contentIntent = contentIntent;
mManager.notify(APPID, notification);
Finally I try to update the progress bar, which doesn't work.
contentView.setProgressBar(R.id.progressBar, 10, 5, false);
What is the secret to actually updating the notification?
You should add these two lines:
// update the notification object
notification.contentView.setProgressBar(R.id.progressBar, 10, 5, false);
// notify the notification manager on the update.
mManager.notify(APPID, notification);
Remember not to notify the status bar too often. If you use that code inside, for example, a onProgressUpdate of a AsyncTask and you notify EVERY progress, you will virtually block the status bar. Notify only when there are changes.
In your layout file, you have the progressbars max set at 0. If it maxes at 0, it cannot go higher than 0. Set it to 100
I had issues while updating the progress bar too often (I'm using a NotificationCompat.Builder
to do the job) which was causing the notification area to block. I solved the issue by skipping updates if they occurs within a minimum interval time like this:
private static final long MIN_UPDATE_INTERVAL = 10000000;
private long lastUpdateTime = System.nanoTime();
and in my update callback:
// Don't update too often
if ((System.nanoTime() - lastUpdateTime)< MIN_UPDATE_INTERVAL) return;
builder.setProgress(max, currentValue, false);
notificationManager.notify(notificationID, builder.build());
lastUpdateTime = System.nanoTime();
This prevent bloking the notiicaton area and also allows a smooth update of the progress bar
精彩评论