4

这是问题所在。

我目前正在开发一个必须提供的应用程序:

广播播放器(来自 url的AAC 直播)和PodCast 播放器(来自 url 的 MP3 流)

应用程序必须能够在后台运行(Android 服务)并通过通知栏中的持久通知向用户公开(Android 前台服务)

(每个问题一个问题,所以在这里我会要求通知)

由于我有几个用于管理玩家的类,但我为通知创建一个通用类将是一个好主意。这是我想创建的视图:

在此处输入图像描述 .

这是我现在的通知类:

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]
}

我做对了吗?您将如何管理 RemoteViews 自定义通知?

4

1 回答 1

5

在这种情况下,要求权威来源有点困难,因为大多数音乐播放器都是闭源的,几乎没有其他人使用这种扩展的视图控制通知。

从风格的角度来看,我会委托给 NotificationCompat 而不是扩展它。这样,您可以在内部提供一个更简单的 API,而不是公开整个 NotificationCompat。

至于 RemoteViews,我不确定你到底在问什么。不管你怎么做,只要你保留 Notification 实例,你就可以将实例保留到 RemoteViews(或单个视图)并根据需要更新它们。如果你使用委托而不是继承,它会更干净一些,因为它在“这个字段是通知,这个字段是它的视图”有点意思。

PS 从纯语法的角度来看,尽量使用框架命名准则。最值得注意的是,字段以“m”为前缀并使用驼峰命名法(例如,mNotifTitle)。最后,私有字段是良好测试的氪石。

于 2013-10-01T08:53:24.333 回答