Java 使用Android前台服务为MediaPlayer创建通知

Java 使用Android前台服务为MediaPlayer创建通知,java,android,media-player,android-service,android-notifications,Java,Android,Media Player,Android Service,Android Notifications,问题就在这里 我目前正在处理一个应用程序,该应用程序必须提供: 一个无线电播放器(来自url的AAC实时流媒体) 和一个播客播放器(从url播放MP3) 应用程序必须能够在后台运行(Android服务),并通过通知栏中的持久通知向用户公开(Android前台服务) (每个问题一个问题,所以我在这里要求通知) 由于我有几个用于管理玩家的类,我认为创建一个用于通知的通用类将是一个好主意。以下是我想要创建的视图: 以下是我目前的通知类: public class StreamingNotifica

问题就在这里

我目前正在处理一个应用程序,该应用程序必须提供:

一个无线电播放器(来自url的AAC实时流媒体) 和一个播客播放器(从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]
}

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

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

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

至于RemoteView,我不确定你到底在问什么。无论如何,只要保留通知实例,就可以将实例保留到RemoteView(或单个视图)并根据需要进行更新。如果您使用委托而不是继承,那么它会更干净一些,因为它在某种程度上可以理解为“此字段是通知,此字段是其视图”


另外,从纯语法的角度来看,尝试使用框架命名指南。最值得注意的是,字段前缀为“m”和用例(例如mNotifTitle)。最后,私人领域是良好测试的基石。

谢谢您的回复。你在很多方面确实是对的,我将不得不在我的库中重做一些东西^^^我能问一下你为什么说“私人领域是好测试的氪石”?我使用它们通常是为了某种安全(即使没有什么是真正安全的)。最后,你知道关于这种通知的一些图图/详细文件吗?(来自我经常使用的官方文档)Private/public/protected与安全性完全无关-您可以在运行时使用反射更改字段的访问级别。这是关于组件以及它们应该知道的内容。就个人而言,除非我必须指定它,否则我会让字段具有包可见性(即,没有说明符)。这使得测试更加容易,因为我可以将测试与测试代码放在同一个包中,并且可以自由地检查被测试单元的内部状态(阅读的文本也更少)。对于私有字段,没有办法做到这一点(除非您使用getter泄漏所有字段)。那我的第二个问题呢?恐怕我不能帮你做教程。我不从教程中学习,所以我不跟踪它们。从文档判断,这并不难做到——您需要两个RemoteView,一个用于折叠,另一个用于扩展通知。使用NotificationCompat生成折叠的通知。然后,在创建的通知上设置bigContentView,就是这样(确保只在正确的API级别之后执行)。跟踪所有按钮、文本字段和图像是一件痛苦和麻烦的事情,但这是好用户体验的代价。:)谢谢。我认为你的答案是被接受的,因为它是唯一的,也是一个非常好的答案;)我想我得把你的建议写在纸上!给我一个建议。我使用RemoteView构建了一个通知大视图来控制播放/暂停,如以下链接(stackoverflow.com/questions/14508369/…)所有操作都正常,但当我单击设备后退按钮并从应用程序中退出时,单击事件(播放/暂停/前进/关闭)按钮不起作用。请帮助我。首先,您的链接未满。那么您的意思是:当您完成()应用程序的根活动时,您的通知不再响应了?