Creating a notification for MediaPlayer with an An

2019-04-11 19:47发布

问题:

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.