问题
Here is the problem.
I am currently working on an application that must provide :
A Radio Player (AAC live streaming from an url) And a PodCast player (MP3 Streaming from an url)
The application must be able to run in background (Android Service) and be exposed to the user with a persistant notification in the Notification Bar (Android Foreground Service)
(ONE problem per question so here i'll be asking for the notification)
Since i have several class for managing players, i though creating a generic class for the noticication would be a good idea. Here is the kind of view i would like to create :

Here is my notification class for now :
public class StreamingNotification extends NotificationCompat {
/**
* PRIVATE ATTRIBUTES
*/
// log
private static final String TAG = StreamingNotification.class.getSimpleName();
// notification
private NotificationManager _notificationManager;
private NotificationCompat.Builder _builder = null;
private Notification _notification;
// data
public static final int NOTIFICATION_ID = 1;
private Class _notifActivity;
private Context _context;
private String _notifTitle;
private String _notifText;
private int _notifLayout;
public StreamingNotification(String _notifActivity, Context _context, String _notifTitle, String _notifText, int _notifLayout) {
super();
try {
this._notifActivity = Class.forName(_notifActivity);
}
catch (ClassNotFoundException e) {
e.printStackTrace();
}
this._context = _context;
this._notifTitle = _notifTitle;
this._notifText = _notifText;
this._notifLayout = _notifLayout;
// manager
_notificationManager = (NotificationManager)_context.getSystemService(Context.NOTIFICATION_SERVICE);
// notif builder
_builder = new NotificationCompat.Builder(_context);
buildSimpleNotification();
}
private void buildSimpleNotification() {
// notif intent
final Intent notificationIntent = new Intent(_context, _notifActivity);
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
// remote view
RemoteViews contentView = new RemoteViews(_context.getPackageName(), _notifLayout);
// pending intent
final PendingIntent contentIntent = PendingIntent.getActivity(_context, NOTIFICATION_ID, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
_builder.setContentIntent(contentIntent).setContent(contentView).setOngoing(true).setWhen(System.currentTimeMillis()).setAutoCancel(false).setContentTitle(_notifTitle)
.setContentText(_notifText);
// notification build
_notification = _builder.getNotification();
_notification.flags |= Notification.FLAG_ONGOING_EVENT | Notification.FLAG_FOREGROUND_SERVICE | Notification.FLAG_NO_CLEAR;
_notificationManager.notify(NOTIFICATION_ID, _notification);
}
[GETTERS AND SETTERS]
}
Am I doing it right ? How would you manage a RemoteViews custom notification ?
回答1:
Asking for an authoritative source is a bit difficult in this case, since most music players are closed-source and virtually no one else uses that sort of expanded controls-in-the-view notification.
From a stylistic point of view, I would delegate to NotificationCompat instead of extend it. That way, you can present a simpler API internally as opposed to exposing the whole of NotificationCompat.
As for RemoteViews, I'm not sure what you're asking exactly. However you do it, as long as you keep the Notification instance, you can keep the instance to RemoteViews (or the individual views) and update them as needed. If you go with delegation instead of inheritance, it would be quite a bit cleaner as it makes sense in a "this field is the notification, this field is its Views" kinda way.
P.S. From a purely syntactical point of view, try to use the framework naming guidelines. Most notably, fields are prefixed with 'm' and use camelCase (e.g., mNotifTitle). Lastly, private fields are the kryptonite of good tests.
来源:https://stackoverflow.com/questions/17529234/creating-a-notification-for-mediaplayer-with-an-android-foreground-service