精华内容
下载资源
问答
  • android 通知栏样式We’ve discussed and implemented basic Notifications in this post. In this tutorial, we’ll be looking into more advanced features of android notification and styling our ...

    android 通知栏样式

    We’ve discussed and implemented basic Notifications in this post. In this tutorial, we’ll be looking into more advanced features of android notification and styling our notifications in different ways.

    我们已经讨论并实现基本声明文章。 在本教程中,我们将研究android通知的更高级功能,并以不同方式设置通知样式。

    Android通知样式 (Android Notification Styling)

    Android Notification have plenty of powerful features that when used correctly would significantly improve the UX and user engagement. Some noteworthy features that we’ll be covering in this Android Notification tutorial are listed below.

    Android Notification具有许多强大的功能,如果正确使用它们,将大大提高用户体验和用户参与度。 下面列出了我们将在本Android Notification教程中介绍的一些值得注意的功能。

    1. Notification Actions

      通知动作
    2. Heads Up Notification

      抬头通知
    3. Big Text Style Notification

      大文字样式通知
    4. Big Picture Style Notification

      大图样式通知
    5. Inbox Style Notification

      收件箱样式通知
    6. Message Style Notification

      邮件样式通知

    Android notification consists of three major components:

    Android通知包含三个主要组件:

    1. Small Icon (often our app logo)

      小图标(通常是我们的应用徽标)
    2. Title

      标题
    3. Content Text

      内容文字

    The introduction of Android Nougat (API 24) has given a new look to notifications as shown below.

    Android Nougat(API 24)的引入使通知有了新外观,如下所示。

    The large icon now appears on the right. There’s an arrow besides the notification title that lets us expand, collapse the notification.

    现在,大图标出现在右侧。 通知标题旁边有一个箭头,可让我们展开,折叠通知。

    In this tutorial, we’ll be styling our notifications using some pre-defined awesome styles that Android has in store for us. We’ll be covering the following features at length.

    在本教程中,我们将使用Android为我们提供的一些预定义超赞样式来设置通知的样式。 我们将详细介绍以下功能。

    1. Android Notification Actions

      Android通知动作
    2. Heads Up Notifications

      抬头通知
    3. Rich Notifications

      丰富的通知

    Android通知动作 (Android Notification Actions)

    Android Notification actions are basically buttons placed below the body of the notification. A Notification action must include an icon, a label, and a PendingIntent to be fired when the action is selected by the user.

    Android Notification动作基本上是位于通知主体下方的按钮。 通知动作必须包含一个图标,一个标签以及一个当用户选择该动作时要触发的PendingIntent

    With the Introduction of Android N, the icons are omitted from the action buttons to give space to other components.

    随着Android N的介绍,操作按钮中的图标被省略,以留出空间给其他组件。

    An example of notification actions in Pre Nougat devices is given below.

    牛轧糖前设备中的通知操作示例如下。

    android notification before android N

    Pre-Nougat Notification Action Design

    牛轧糖前通知动作设计

    An example of Notification Actions in Android N and above is given below.

    以下是Android N及更高版本中的通知操作示例。

    android notification tutorial

    Notification Action in Android Nougat

    Android Nougat中的通知动作

    抬头通知 (Heads Up Notifications)

    With the introduction of Android Lollipop (API level 21), notifications can appear in a small floating window (also called a heads-up notification) when the device is active (that is, the device is unlocked and its screen is on).

    随着Android Lollipop(API级别21)的引入,当设备处于活动状态(即设备已解锁且屏幕处于打开状态)时,通知可以显示在一个小的浮动窗口中(也称为平视通知)。

    Such type of notifications are commonly seen when you’re using an application and you get a call. A small floating notification known as heads up notifications pops up with the notification actions to accept or decline a call.

    当您使用应用程序并接到电话时,通常会看到此类通知。 一个小的浮动通知(称为抬头通知)随通知动作弹出,以接听或拒绝呼叫。

    丰富的通知 (Rich Notifications)

    Android allows us to add rich styles to our application with the introduction of Android L. Using these styles would make the notification look more appealing than ever. Some of the known styles that are used in many applications are listed below and are self-explanatory.

    Android允许我们通过引入Android L向我们的应用程序添加丰富的样式。使用这些样式将使通知看起来比以往更具吸引力。 下面列出了许多应用程序中使用的一些已知样式,这些样式是不言自明的。

    • BigTextStyle

      BigTextStyle
    • BigPictureStyle

      BigPictureStyle
    • InboxStyle

      InboxStyle
    • MessageStyle

      MessageStyle

    We know that notifications on Android N can be expanded using the arrows. To expand notifications on pre-Nougat versions, you can swipe down over the notification using two fingers.

    我们知道可以使用箭头扩展Android N上的通知。 要扩展牛轧糖之前版本的通知,您可以用两根手指在通知上向下滑动。

    Not all Android versions would support the above styles. In case an Android OS doesn’t support the rich style, that style would simply be ignored.

    并非所有的Android版本都支持上述样式。 如果Android操作系统不支持丰富样式,则该样式将被忽略。

    Now let’s jump into the business end of this tutorial and develop an application that’ll have all the above features.

    现在,让我们进入本教程的业务范围,并开发一个具有上述所有功能的应用程序。

    Android Notification Tutorial项目结构 (Android Notification Tutorial Project Structure)

    Android通知教程代码 (Android Notification Tutorial Code)

    The code for the activity_main.xml is given below:

    下面给出了activity_main.xml的代码:

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.constraint.ConstraintLayout xmlns:android="https://schemas.android.com/apk/res/android"
        xmlns:app="https://schemas.android.com/apk/res-auto"
        xmlns:tools="https://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context="com.journaldev.stylingnotifications.MainActivity">
    
        <Button
            android:id="@+id/btnNotificationActions"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="NOTIFICATION ACTIONS"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintVertical_bias="0.196" />
    
        <Button
            android:id="@+id/btnHeadsUp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="8dp"
            android:layout_marginRight="8dp"
            android:layout_marginTop="8dp"
            android:text="HEADS UP NOTIFICATION"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/btnNotificationActions" />
    
        <Button
            android:id="@+id/btnBigTextStyle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="BIG TEXT STYLE"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            android:layout_marginTop="8dp"
            app:layout_constraintTop_toBottomOf="@+id/btnHeadsUp" />
    
        <Button
            android:id="@+id/btnBigPictureStyle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="BIG PICTURE STYLE"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            android:layout_marginTop="8dp"
            app:layout_constraintTop_toBottomOf="@+id/btnBigTextStyle" />
    
        <Button
            android:id="@+id/btnInboxStyle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="INBOX STYLE"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            android:layout_marginTop="8dp"
            app:layout_constraintTop_toBottomOf="@+id/btnBigPictureStyle" />
    
        <Button
            android:id="@+id/btnMessageStyle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="MESSAGE STYLE"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            android:layout_marginTop="8dp"
            app:layout_constraintTop_toBottomOf="@+id/btnInboxStyle" />
    
    </android.support.constraint.ConstraintLayout>

    We’ve added a button for each type of notification that we’ll be discussing.

    我们为将要讨论的每种通知类型添加了一个按钮。

    The skeleton code for the MainActivity.java is given below.

    MainActivity.java的框架代码如下。

    public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    
        Button btnNotificationActions, btnHeadsUpNotification, btnBigTextStyle, btnBigPictureStyle,
                btnInboxStyle, btnMessageStyle;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            clearNotification();
    
            btnNotificationActions = (Button) findViewById(R.id.btnNotificationActions);
            btnHeadsUpNotification = (Button) findViewById(R.id.btnHeadsUp);
            btnBigTextStyle = (Button) findViewById(R.id.btnBigTextStyle);
            btnBigPictureStyle = (Button) findViewById(R.id.btnBigPictureStyle);
            btnInboxStyle = (Button) findViewById(R.id.btnInboxStyle);
            btnMessageStyle = (Button) findViewById(R.id.btnMessageStyle);
            btnNotificationActions.setOnClickListener(this);
            btnHeadsUpNotification.setOnClickListener(this);
            btnBigTextStyle.setOnClickListener(this);
            btnBigPictureStyle.setOnClickListener(this);
            btnInboxStyle.setOnClickListener(this);
            btnMessageStyle.setOnClickListener(this);
    
        }
    
    
        @Override
        public void onClick(View v) {
            switch (v.getId()) {
                case R.id.btnNotificationActions:
                    notificationActions();
                    break;
                case R.id.btnHeadsUp:
                    headsUpNotification();
                    break;
                case R.id.btnBigTextStyle:
                    bigTextStyleNotification();
                    break;
                case R.id.btnBigPictureStyle:
                    bigPictureStyleNotification();
                    break;
                case R.id.btnInboxStyle:
                    inboxStyleNotification();
                    break;
                case R.id.btnMessageStyle:
                    messageStyleNotification();
                    break;
    
            }
        }
    
    
       public PendingIntent getLaunchIntent(int notificationId, Context context) {
    
            Intent intent = new Intent(context, MainActivity.class);
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
            intent.putExtra("notificationId", notificationId);
            return PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
        }
    
    
        private void clearNotification() {
            int notificationId = getIntent().getIntExtra("notificationId", 0);
    
            NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
            manager.cancel(notificationId);
        }
    
      private void notificationActions()
      {
       //Logic goes here.
      }
    
      private void headsUpNotification()
      {
       //Logic goes here.
      }
    
      private void bigTextStyleNotification()
      {
       //Logic goes here.
      }
    
      private void bigPictureStyleNotification();
      {
       //Logic goes here.
      }
    
      private void inboxStyleNotification()
      {
       //Logic goes here.
      }
    
      private void messageStyleNotification()
      {
       //Logic goes here.
      }
    }

    The method clearNotification() is used to clear any existing notifications from the notification bar.
    The method getLaunchIntent() returns an instance of PendingIntent which when triggered from the notification, will relaunch the application.

    方法clearNotification()用于清除通知栏中的所有现有通知。
    方法getLaunchIntent()返回PendingIntent的实例,当从通知中触发该实例时,它将重新启动应用程序。

    Before we delve into the implementation of each type of notification, let’s define the BroadcastReceiver as shown below.

    在深入研究每种通知的实现之前,让我们定义如下的BroadcastReceiver

    package com.journaldev.stylingnotifications;
    
    import android.app.NotificationManager;
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    
    public class NotificationReceiver extends BroadcastReceiver {
    
        @Override
        public void onReceive(Context context, Intent intent) {
    
            int notificationId = intent.getIntExtra("notificationId", 0);
    
            NotificationManager manager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
            manager.cancel(notificationId);
        }
    }

    Update the AndroidManifest.xml file with the receiver defined as shown below.

    使用定义如下的接收器更新AndroidManifest.xml文件。

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="https://schemas.android.com/apk/res/android"
        package="com.journaldev.stylingnotifications">
    
        <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:theme="@style/AppTheme">
    
            <receiver android:name=".NotificationReceiver"
                android:exported="false"/>
    
    
            <activity android:name=".MainActivity">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
    
    
        </application>
    
    </manifest>

    在通知中添加动作 (Adding actions inside a notification)

    private void notificationActions() {
    
            int NOTIFICATION_ID = 1;
    
    
            NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
            builder.setSmallIcon(R.drawable.jd);
            builder.setColor(ContextCompat.getColor(this, R.color.colorPrimaryDark));
            builder.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.jd));
            builder.setContentTitle("Notification Actions");
            builder.setContentText("Tap View to launch our website");
            builder.setAutoCancel(true);
            PendingIntent launchIntent = getLaunchIntent(NOTIFICATION_ID, getBaseContext());
    
            Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://www.journaldev.com"));
            PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0);
    
            Intent buttonIntent = new Intent(getBaseContext(), NotificationReceiver.class);
            buttonIntent.putExtra("notificationId", NOTIFICATION_ID);
            PendingIntent dismissIntent = PendingIntent.getBroadcast(getBaseContext(), 0, buttonIntent, 0);
    
            builder.setContentIntent(launchIntent);
            builder.addAction(android.R.drawable.ic_menu_view, "VIEW", pendingIntent);
            builder.addAction(android.R.drawable.ic_delete, "DISMISS", dismissIntent);
    
            NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
    
            // Will display the notification in the notification bar
            notificationManager.notify(NOTIFICATION_ID, builder.build());
        }

    In the above code, we set the various styles on the instance builder.

    在上面的代码中,我们在实例builder上设置了各种样式。

    setColor() sets the custom color for the notification icon, title and action button texts.

    setColor()设置通知图标,标题和操作按钮文本的自定义颜色。

    addAction() is used to set the action buttons beneath the notification content. It expects three params: icon, text and the instance of PendingIntent.

    addAction()用于在通知内容下方设置操作按钮。 它需要三个参数:图标,文本和PendingIntent实例。

    setContentIntent() sets the PendingIntent that’ll be triggered when the body of the notification is clicked. In the above code we’ve simply added the PendingIntent to relaunch the application.

    setContentIntent()设置单击通知正文时将触发的PendingIntent。 在上面的代码中,我们仅添加了PendingIntent以重新启动该应用程序。

    setAutoCancel(true) is used to dismiss the notification when its clicked.

    setAutoCancel(true)用于在单击通知时关闭该通知。

    NotificationManager class is used to display the notification.

    NotificationManager类用于显示通知。

    The output of the application when the above type of notification is triggered is given below.

    android notification example

    下面给出了触发上述类型的通知时应用程序的输出。

    Note:

    注意事项

    • When the VIEW button is clicked, the url is launched in the browser but the notification isn’t dismissed.

      单击“查看”按钮时,URL将在浏览器中启动,但不会关闭通知。
    • When the DISMISS button is clicked the notification is cleared but the notification tray stays open.

      单击“ DISMISS”按钮时,通知已清除,但通知托盘保持打开状态。
    • When the Notification content is clicked, the notification is dismissed as well as the activity is re-launched. This is where getLaunchIntent() and clearNotification() methods are invoked.

      单击通知内容后,该通知将被取消,并且该活动将重新启动。 这是调用getLaunchIntent()clearNotification()方法的地方。

    实施抬头通知 (Implementing Heads Up Notification)

    private void headsUpNotification() {
    
            int NOTIFICATION_ID = 1;
            NotificationCompat.Builder builder =
                    new NotificationCompat.Builder(this)
                            .setSmallIcon(R.drawable.jd)
                            .setContentTitle("Heads Up Notification")
                            .setContentText("View the latest Swift Tutorial")
                            .setAutoCancel(true)
                            .setDefaults(NotificationCompat.DEFAULT_ALL)
                            .setPriority(NotificationCompat.PRIORITY_HIGH);
    
            Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://www.journaldev.com/15126/swift-function"));
            PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0);
    
            Intent buttonIntent = new Intent(getBaseContext(), NotificationReceiver.class);
            buttonIntent.putExtra("notificationId", NOTIFICATION_ID);
            PendingIntent dismissIntent = PendingIntent.getBroadcast(getBaseContext(), 0, buttonIntent, 0);
    
            builder.addAction(android.R.drawable.ic_menu_view, "VIEW", pendingIntent);
            builder.addAction(android.R.drawable.ic_delete, "DISMISS", dismissIntent);
    
            NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
            notificationManager.notify(NOTIFICATION_ID, builder.build());
        }

    To set a notification as heads up notification, two properties need to set on the builder instance.

    要将通知设置为抬头通知,需要在构建器实例上设置两个属性。

    setDefaults(NotificationCompat.DEFAULT_ALL)
    setPriority(NotificationCompat.PRIORITY_HIGH)

    Swiping a heads up notification would dismiss it. If it’s not dismissed, the heads-up notifications will fade away and change into a standard notification in the status bar.

    刷单向通知会取消该通知。 如果未取消,则抬头通知将消失,并在状态栏中变为标准通知。

    The output of heads up notification is given below.

    android notification heads up

    抬头通知的输出如下。

    BigTextStyle通知 (BigTextStyle Notification)

    private void bigTextStyleNotification() {
            int NOTIFICATION_ID = 1;
    
            PendingIntent launchIntent = getLaunchIntent(NOTIFICATION_ID, getBaseContext());
            Intent buttonIntent = new Intent(getBaseContext(), NotificationReceiver.class);
            buttonIntent.putExtra("notificationId", NOTIFICATION_ID);
            PendingIntent dismissIntent = PendingIntent.getBroadcast(getBaseContext(), 0, buttonIntent, 0);
    
    
            NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
            builder.setSmallIcon(R.drawable.jd);
            builder.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.jd));
            builder.setContentTitle("Big Text Style");
            builder.setStyle(new NotificationCompat.BigTextStyle().bigText(getResources().getString(R.string.lorem_ipsum)));
            builder.setAutoCancel(true);
            builder.setContentIntent(launchIntent);
            builder.addAction(android.R.drawable.ic_delete, "DISMISS", dismissIntent);
            builder.addAction(android.R.drawable.ic_menu_send, "OPEN APP", launchIntent);
            NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
    
            // Will display the notification in the notification bar
            notificationManager.notify(NOTIFICATION_ID, builder.build());
        }

    A notification can be customised into a big text style notification by setting the style as
    NotificationCompat.BigTextStyle(). The string to be displayed is entered inside the method bigText().

    通过将样式设置为,可以将通知定制为大文本样式通知
    NotificationCompat.BigTextStyle() 。 要显示的字符串在方法bigText()中输入。

    The output of above type of notification is given below.

    android notification big text style

    上述通知的输出如下。

    BigPictureStyle通知 (BigPictureStyle Notification)

    private void bigPictureStyleNotification() {
            int NOTIFICATION_ID = 1;
            Bitmap pic = BitmapFactory.decodeResource(getResources(), R.drawable.bg);
    
            Intent buttonIntent = new Intent(getBaseContext(), NotificationReceiver.class);
            buttonIntent.putExtra("notificationId", NOTIFICATION_ID);
            PendingIntent dismissIntent = PendingIntent.getBroadcast(getBaseContext(), 0, buttonIntent, 0);
            PendingIntent launchIntent = getLaunchIntent(NOTIFICATION_ID, getBaseContext());
    
            NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
            builder.setSmallIcon(R.drawable.jd);
            builder.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.jd));
            builder.setContentTitle("Big Picture Style");
            builder.setStyle(new NotificationCompat.BigPictureStyle().bigPicture(pic));
            builder.setAutoCancel(true);
            builder.setContentIntent(launchIntent);
            builder.addAction(android.R.drawable.ic_delete, "DISMISS", dismissIntent);
    
            NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
    
            // Will display the notification in the notification bar
            notificationManager.notify(NOTIFICATION_ID, builder.build());
        }

    For BigPicture to be displayed inside a notification the style is set as NotificationCompat.BigPictureStyle().bigPicture(bitmap)).

    为了使BigPicture显示在通知中,样式设置为NotificationCompat.BigPictureStyle().bigPicture(bitmap))

    The output with the above type of notification is given below.

    android notification custom style big picture

    具有上述通知类型的输出如下。

    InboxStyle通知 (InboxStyle Notification)

    private void inboxStyleNotification() {
            int NOTIFICATION_ID = 1;
    
            PendingIntent launchIntent = getLaunchIntent(NOTIFICATION_ID, getBaseContext());
            NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
            builder.setSmallIcon(R.drawable.jd);
            builder.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.jd));
            builder.setStyle(new NotificationCompat.InboxStyle().addLine("Hello").addLine("Are you there?").addLine("How's your day?").setBigContentTitle("3 New Messages for you").setSummaryText("Inbox"));
            builder.setAutoCancel(true);
            builder.setContentIntent(launchIntent);
            NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
    
            // Will display the notification in the notification bar
            notificationManager.notify(NOTIFICATION_ID, builder.build());
        }

    An inbox style notification is set by using the style new NotificationCompat.InboxStyle().
    Each message is placed inside the method addLine(). The summary text of all the messages is placed inside the method setSummaryText().
    setContentTitle() is replaced with setBigContentTitle() in this style

    收件箱样式通知是通过使用样式new NotificationCompat.InboxStyle()
    每个消息都放在方法addLine() 。 所有消息的摘要文本都放在方法setSummaryText()
    setContentTitle()以此样式替换为setBigContentTitle()

    The output of the above type of notification is given below

    custom android notification inbox style

    上述通知的输出如下

    邮件样式通知 (Message Style Notification)

    Message Style is introduced with Android N. Typically used for chats.

    消息样式是Android N引入的。通常用于聊天。

    private void messageStyleNotification() {
            int NOTIFICATION_ID = 1;
    
            PendingIntent launchIntent = getLaunchIntent(NOTIFICATION_ID, getBaseContext());
            NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
            builder.setSmallIcon(R.drawable.jd);
            builder.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.jd));
            builder.setContentTitle("Messages");
            builder.setStyle(new NotificationCompat.MessagingStyle("Teacher").setConversationTitle("Q&A Group")
                    .addMessage("This type of notification was introduced in Android N. Right?",0,"Student 1")
                    .addMessage("Yes",0,null)
                    .addMessage("The constructor is passed with the name of the current user. Right?",0,"Student 2")
                    .addMessage("True",0,null));
            builder.setAutoCancel(true);
            builder.setContentIntent(launchIntent);
            NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
    
            // Will display the notification in the notification bar
            notificationManager.notify(NOTIFICATION_ID, builder.build());
        }

    In the above code NotificationCompat.MessagingStyle(String) contains a string that represents the current user(Typically in a chat its you!).
    Each message is added in the method addMessage() with the timestamp as well as sender name.
    If the sender name is set to null it signifies that the message is from the current user(you) and the name is taken from the constructor.

    在上面的代码中, NotificationCompat.MessagingStyle(String)包含一个表示当前用户的字符串(通常在聊天中是您!)。
    每条消息都将在方法addMessage()中添加时间戳和发件人名称。
    如果发件人名称设置为null,则表示该消息来自当前用户(您),并且该名称来自构造函数。

    The output of the above type of notification is given below.

    android message style notification

    上述通知的输出如下。

    Adding all the above methods in the MainActivity.java would give us the below code.

    MainActivity.java添加上述所有方法将为我们提供以下代码。

    package com.journaldev.stylingnotifications;
    
    import android.app.NotificationManager;
    import android.app.PendingIntent;
    import android.content.Context;
    import android.content.Intent;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.net.Uri;
    import android.support.v4.content.ContextCompat;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.support.v4.app.NotificationCompat;
    import android.view.View;
    import android.widget.Button;
    
    public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    
        Button btnNotificationActions, btnHeadsUpNotification, btnBigTextStyle, btnBigPictureStyle,
                btnInboxStyle, btnMessageStyle;
    
        NotificationCompat.Builder builder;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            clearNotification();
    
            btnNotificationActions = (Button) findViewById(R.id.btnNotificationActions);
            btnHeadsUpNotification = (Button) findViewById(R.id.btnHeadsUp);
            btnBigTextStyle = (Button) findViewById(R.id.btnBigTextStyle);
            btnBigPictureStyle = (Button) findViewById(R.id.btnBigPictureStyle);
            btnInboxStyle = (Button) findViewById(R.id.btnInboxStyle);
            btnMessageStyle = (Button) findViewById(R.id.btnMessageStyle);
            btnNotificationActions.setOnClickListener(this);
            btnHeadsUpNotification.setOnClickListener(this);
            btnBigTextStyle.setOnClickListener(this);
            btnBigPictureStyle.setOnClickListener(this);
            btnInboxStyle.setOnClickListener(this);
            btnMessageStyle.setOnClickListener(this);
    
        }
    
    
        @Override
        public void onClick(View v) {
            switch (v.getId()) {
                case R.id.btnNotificationActions:
                    notificationActions();
                    break;
                case R.id.btnHeadsUp:
                    headsUpNotification();
                    break;
                case R.id.btnBigTextStyle:
                    bigTextStyleNotification();
                    break;
                case R.id.btnBigPictureStyle:
                    bigPictureStyleNotification();
                    break;
                case R.id.btnInboxStyle:
                    inboxStyleNotification();
                    break;
                case R.id.btnMessageStyle:
                    messageStyleNotification();
                    break;
    
            }
        }
    
        private void notificationActions() {
    
            int NOTIFICATION_ID = 1;
    
    
            builder = new NotificationCompat.Builder(this);
            builder.setSmallIcon(R.drawable.jd);
            builder.setColor(ContextCompat.getColor(this, R.color.colorPrimaryDark));
            builder.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.jd));
            builder.setContentTitle("Notification Actions");
            builder.setContentText("Tap View to launch our website");
            builder.setAutoCancel(true);
            PendingIntent launchIntent = getLaunchIntent(NOTIFICATION_ID, getBaseContext());
    
            Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://www.journaldev.com"));
            PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0);
    
            Intent buttonIntent = new Intent(getBaseContext(), NotificationReceiver.class);
            buttonIntent.putExtra("notificationId", NOTIFICATION_ID);
            PendingIntent dismissIntent = PendingIntent.getBroadcast(getBaseContext(), 0, buttonIntent, 0);
    
            builder.setContentIntent(launchIntent);
            builder.addAction(android.R.drawable.ic_menu_view, "VIEW", pendingIntent);
            builder.addAction(android.R.drawable.ic_delete, "DISMISS", dismissIntent);
    
            buildNotification(NOTIFICATION_ID);
        }
    
        public PendingIntent getLaunchIntent(int notificationId, Context context) {
    
            Intent intent = new Intent(context, MainActivity.class);
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
            intent.putExtra("notificationId", notificationId);
            return PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
        }
    
    
        private void clearNotification() {
            int notificationId = getIntent().getIntExtra("notificationId", 0);
    
            NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
            manager.cancel(notificationId);
        }
    
        private void headsUpNotification() {
    
            int NOTIFICATION_ID = 1;
            builder =
                    new NotificationCompat.Builder(this)
                            .setSmallIcon(R.drawable.jd)
                            .setContentTitle("Heads Up Notification")
                            .setContentText("View the latest Swift Tutorial")
                            .setAutoCancel(true)
                            .setDefaults(NotificationCompat.DEFAULT_ALL)
                            .setPriority(NotificationCompat.PRIORITY_HIGH);
    
            Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://www.journaldev.com/15126/swift-function"));
            PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0);
    
            Intent buttonIntent = new Intent(getBaseContext(), NotificationReceiver.class);
            buttonIntent.putExtra("notificationId", NOTIFICATION_ID);
            PendingIntent dismissIntent = PendingIntent.getBroadcast(getBaseContext(), 0, buttonIntent, 0);
    
            builder.addAction(android.R.drawable.ic_menu_view, "VIEW", pendingIntent);
            builder.addAction(android.R.drawable.ic_delete, "DISMISS", dismissIntent);
    
            buildNotification(NOTIFICATION_ID);
        }
    
        private void bigTextStyleNotification() {
            int NOTIFICATION_ID = 1;
    
            PendingIntent launchIntent = getLaunchIntent(NOTIFICATION_ID, getBaseContext());
            Intent buttonIntent = new Intent(getBaseContext(), NotificationReceiver.class);
            buttonIntent.putExtra("notificationId", NOTIFICATION_ID);
            PendingIntent dismissIntent = PendingIntent.getBroadcast(getBaseContext(), 0, buttonIntent, 0);
    
    
            builder = new NotificationCompat.Builder(this);
            builder.setSmallIcon(R.drawable.jd);
            builder.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.jd));
            builder.setContentTitle("Big Text Style");
            builder.setStyle(new NotificationCompat.BigTextStyle().bigText(getResources().getString(R.string.lorem_ipsum)));
            builder.setAutoCancel(true);
            builder.setContentIntent(launchIntent);
            builder.addAction(android.R.drawable.ic_delete, "DISMISS", dismissIntent);
            builder.addAction(android.R.drawable.ic_menu_send, "OPEN APP", launchIntent);
    
            buildNotification(NOTIFICATION_ID);
        }
    
        private void bigPictureStyleNotification() {
            int NOTIFICATION_ID = 1;
    
            Bitmap pic = BitmapFactory.decodeResource(getResources(), R.drawable.bg);
    
    
            Intent buttonIntent = new Intent(getBaseContext(), NotificationReceiver.class);
            buttonIntent.putExtra("notificationId", NOTIFICATION_ID);
            PendingIntent dismissIntent = PendingIntent.getBroadcast(getBaseContext(), 0, buttonIntent, 0);
            PendingIntent launchIntent = getLaunchIntent(NOTIFICATION_ID, getBaseContext());
    
    
            builder = new NotificationCompat.Builder(this);
            builder.setSmallIcon(R.drawable.jd);
            builder.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.jd));
            builder.setContentTitle("Big Picture Style");
            builder.setStyle(new NotificationCompat.BigPictureStyle().bigPicture(pic));
            builder.setAutoCancel(true);
            builder.setContentIntent(launchIntent);
            builder.addAction(android.R.drawable.ic_delete, "DISMISS", dismissIntent);
    
            buildNotification(NOTIFICATION_ID);
        }
    
        private void inboxStyleNotification() {
            int NOTIFICATION_ID = 1;
    
            PendingIntent launchIntent = getLaunchIntent(NOTIFICATION_ID, getBaseContext());
            builder = new NotificationCompat.Builder(this);
            builder.setSmallIcon(R.drawable.jd);
            builder.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.jd));
            builder.setContentTitle("Messages");
            builder.setStyle(new NotificationCompat.InboxStyle().addLine("Hello").addLine("Are you there?").addLine("How's your day?").setBigContentTitle("3 New Messages for you").setSummaryText("Inbox"));
            builder.setAutoCancel(true);
            builder.setContentIntent(launchIntent);
            
            buildNotification(NOTIFICATION_ID);
        }
    
        private void messageStyleNotification() {
            int NOTIFICATION_ID = 1;
    
            PendingIntent launchIntent = getLaunchIntent(NOTIFICATION_ID, getBaseContext());
            builder = new NotificationCompat.Builder(this);
            builder.setSmallIcon(R.drawable.jd);
            builder.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.jd));
            builder.setContentTitle("Messages");
            builder.setStyle(new NotificationCompat.MessagingStyle("Teacher").setConversationTitle("Q&A Group")
                    .addMessage("This type of notification was introduced in Android N. Right?", 0, "Student 1")
                    .addMessage("Yes", 0, null)
                    .addMessage("The constructor is passed with the name of the current user. Right?", 0, "Student 2")
                    .addMessage("True", 0, null));
            builder.setAutoCancel(true);
            builder.setContentIntent(launchIntent);
    
            buildNotification(NOTIFICATION_ID);
        }
    
        private void buildNotification(int NOTIFICATION_ID) {
            NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
    
            // Will display the notification in the notification bar
            notificationManager.notify(NOTIFICATION_ID, builder.build());
        }
    }

    This brings an end to android notification tutorial. We’ve styled our notifications in some interesting ways. You can download the final Android notification example project from the link below.

    这结束了android通知教程。 我们以一些有趣的方式设置了通知的样式。 您可以从下面的链接下载最终的Android通知示例项目

    Reference: Official Doc

    参考: 官方文件

    翻译自: https://www.journaldev.com/15468/android-notification-styling

    android 通知栏样式

    展开全文
  • 下面就来说说经常会使用到通知机制中的通知栏框架(Notificaiton),它适用于交互事件的通知。它是位于顶层可以展开的通知列表。它会时不时的提醒你什么软件该更新了,什么人发你微信消息了等。(网上看了...

    在android的应用层中,涉及到很多应用框架,例如:Service框架,Activity管理机制,Broadcast机制,对话框框架,标题栏框架,状态栏框架,通知机制,ActionBar框架等等。

    下面就来说说经常会使用到通知机制中的通知栏框架(Notificaiton),它适用于交互事件的通知。它是位于顶层可以展开的通知列表。它会时不时的提醒你什么软件该更新了,什么人发你微信消息了等。

    (网上看了下,全面介绍的文章不多,所以就萌生了写这篇的念头,随便当作回顾笔记。下面我就通过官方文档、源代码、书上的一些资料汇总下这一块的知识,并通过一个通知栏的汇总DEMO让大家更好的了解这个类的使用,内容有点多,可以根据需求看目录学习)。

    Notificaiton状态通知栏:

    功能作用

    1.显示接收到短消息、即使消息等信息 (如QQ、微信、新浪、短信)

    2.显示客户端的推送消息(如有新版本发布,广告,推荐新闻等)

    3.显示正在进行的事物(例如:后台运行的程序)(如音乐播放器、版本更新时候的下载进度等)

    思维导图结构

    思维导图的大体结构(按照各个节点延伸拓展学习)

    Notificaiton -- service   -- BroadcastReceiver  -- Intent(flag、Action等属性应用) --  PendingIntent

    感慨:

    一个Notificaiton通知的拓展使用就要涉及与4大组建的配合,所以学好整体的知识体系。

    联系:

    1.由于service 是在后台运行,所以它意图做什么我们看不到,可以通过Notificaiton 来显示提醒(如音乐的后台播放)。

    2.service服务和BroadcastReceiver广播相结合,在加上Notificaiton 显示(如程序的后台更新)。

    3.Intent作为意图处理,和Notificaiton的点击时间紧密结合在了一起,并且与BroadcastReceiver和service的联系也紧密不可以分割。

    (service 在后台之后通过BroadcastReceiver来通知Notificaiton 显示相关东西,在通过Intent完成用户的意图操作)

    对应的官方链接

    设计文档 :

    使用教程 :

    大体了解

    Notification支持文字内容显示、震动、三色灯、铃声等多种提示形式,在默认情况下,Notification仅显示消息标题、消息内容、送达时间这3项内容。以下就是通知的基本布局。

    普通视图:

    高度64dp

    大试图的通知在展开前也显示为普通视图

    normal_notification_callouts.png元素:

    1. 标题   Title/Name

    2. 大图标

    Icon/Photo

    3. 内容文字

    4. 内容信息   MESSAGE

    5. 小图标 Secondary

    Icon

    6. 通知的时间 Timestamp,默认为系统发出通知的时间,也可通过setWhen()来设置

    相关分析

    状态通知栏主要涉及到2个类:  Notification 和 NotificationManager

    Notification为通知信息类,它里面对应了通知栏的各个属性

    NotificationManager :  是状态栏通知的管理类,负责发通知、清除通知等操作。

    注意:NotificationManager 是一个系统Service,所以必须通过 getSystemService(NOTIFICATION_SERVICE)方法来获取,方法如下。

    NotificationManager mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

    使用步骤:

    流程模块:

    第一步:

    创建一个通知栏的Builder构造类  (Create a Notification Builder)

    第二步:

    定义通知栏的Action  (Define the Notification's Action)

    第三步:

    设置通知栏点击事件    (Set the Notification's Click Behavior)

    第四步:

    通知   (Issue the Notification)

    代码模块:

    实现系统默认的通知栏效果:

    第一步:获取状态通知栏管理:

    NotificationManager mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

    第二步:实例化通知栏构造器NotificationCompat.Builder:

    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this);

    第三步:对Builder进行配置:

    mBuilder.setContentTitle("测试标题")//设置通知栏标题

    .setContentText("测试内容") //设置通知栏显示内容

    .setContentIntent(getDefalutIntent(Notification.FLAG_AUTO_CANCEL)) //设置通知栏点击意图

    //  .setNumber(number) //设置通知集合的数量

    .setTicker("测试通知来啦") //通知首次出现在通知栏,带上升动画效果的

    .setWhen(System.currentTimeMillis())//通知产生的时间,会在通知信息里显示,一般是系统获取到的时间

    .setPriority(Notification.PRIORITY_DEFAULT) //设置该通知优先级

    //  .setAutoCancel(true)//设置这个标志当用户单击面板就可以让通知将自动取消

    .setOngoing(false)//ture,设置他为一个正在进行的通知。他们通常是用来表示一个后台任务,用户积极参与(如播放音乐)或以某种方式正在等待,因此占用设备(如一个文件下载,同步操作,主动网络连接)

    .setDefaults(Notification.DEFAULT_VIBRATE)//向通知添加声音、闪灯和振动效果的最简单、最一致的方式是使用当前的用户默认设置,使用defaults属性,可以组合

    //Notification.DEFAULT_ALL  Notification.DEFAULT_SOUND 添加声音 // requires VIBRATE permission

    .setSmallIcon(R.drawable.ic_launcher);//设置通知小ICON

    对应的各个方法的属性(部分方法以上代码中已经作注释,就不再介绍):

    (1)方法:设置提醒标志符Flags

    功能:提醒标志符,向通知添加声音、闪灯和振动效果等设置达到通知提醒效果,可以组合多个属性

    有2种设置方法:

    1.实例化通知栏之后通过给他添加.flags属性赋值。

    Notification notification = mBuilder.build();

    notification.flags = Notification.FLAG_AUTO_CANCEL;

    2.通过setContentIntent(PendingIntent intent)方法中的意图设置对应的flags

    public PendingIntent getDefalutIntent(int flags){

    PendingIntent pendingIntent= PendingIntent.getActivity(this, 1, new Intent(), flags);

    return pendingIntent;

    }

    提醒标志符成员:

    Notification.FLAG_SHOW_LIGHTS              //三色灯提醒,在使用三色灯提醒时候必须加该标志符

    Notification.FLAG_ONGOING_EVENT          //发起正在运行事件(活动中)

    Notification.FLAG_INSISTENT//让声音、振动无限循环,直到用户响应 (取消或者打开)

    Notification.FLAG_ONLY_ALERT_ONCE  //发起Notification后,铃声和震动均只执行一次

    Notification.FLAG_AUTO_CANCEL      //用户单击通知后自动消失

    Notification.FLAG_NO_CLEAR          //只有全部清除时,Notification才会清除,不清楚该通知(QQ的通知无法清除,就是用的这个)

    Notification.FLAG_FOREGROUND_SERVICE    //表示正在运行的服务

    (2)方法:.setDefaults(int defaults)     (NotificationCompat.Builder中的方法,用于提示)

    功能:向通知添加声音、闪灯和振动效果的最简单、使用默认(defaults)属性,可以组合多个属性(和方法1中提示效果一样的)

    对应属性:

    Notification.DEFAULT_VIBRATE    //添加默认震动提醒  需要 VIBRATE permission

    Notification.DEFAULT_SOUND    // 添加默认声音提醒

    Notification.DEFAULT_LIGHTS// 添加默认三色灯提醒

    Notification.DEFAULT_ALL// 添加默认以上3种全部提醒

    (3)方法:setVibrate(long[] pattern)

    功能:设置震动方式。

    使用:

    .setVibrate(new long[] {0,300,500,700});

    实现效果:延迟0ms,然后振动300ms,在延迟500ms,接着在振动700ms。

    以上方法的还有种写法是

    mBuilder.build().vibrate = new long[] {0,300,500,700};

    以此类推,2种写法都可以。

    如果希望设置默认振动方式,设置了方法(2)中默认为DEFAULT_VIBRATE 即可。

    (4)方法:.setLights(intledARGB ,intledOnMS ,intledOffMS )

    功能:android支持三色灯提醒,这个方法就是设置不同场景下的不同颜色的灯。

    描述:其中ledARGB 表示灯光颜色、 ledOnMS 亮持续时间、ledOffMS 暗的时间。

    注意:1)只有在设置了标志符Flags为Notification.FLAG_SHOW_LIGHTS的时候,才支持三色灯提醒。

    2)这边的颜色跟设备有关,不是所有的颜色都可以,要看具体设备。

    使用:

    .setLights(0xff0000ff, 300, 0)

    同理,以下方法也可以设置同样效果:

    Notification notify = mBuilder.build();

    notify.flags = Notification.FLAG_SHOW_LIGHTS;

    notify.ledARGB = 0xff0000ff;

    notify.ledOnMS = 300;

    notify.ledOffMS = 300;

    如果希望使用默认的三色灯提醒,设置了方法(2)中默认为DEFAULT_LIGHTS即可。

    (5)方法:.setSound(Uri sound)

    功能:设置默认或则自定义的铃声,来提醒。

    //获取默认铃声

    .setDefaults(Notification.DEFAULT_SOUND)

    //获取自定义铃声

    .setSound(Uri.parse("file:///sdcard/xx/xx.mp3"))

    //获取Android多媒体库内的铃声

    .setSound(Uri.withAppendedPath(Audio.Media.INTERNAL_CONTENT_URI, "5"))

    同理相同效果的另一种设置方法这边就不讲, 和上面的都是一样的。

    (6)方法:.setPriority(int pri)

    功能:设置优先级

    对应优先级描述如下图:

    优先级用户

    MAX

    重要而紧急的通知,通知用户这个事件是时间上紧迫的或者需要立即处理的。

    HIGH

    高优先级用于重要的通信内容,例如短消息或者聊天,这些都是对用户来说比较有兴趣的。

    DEFAULT

    默认优先级用于没有特殊优先级分类的通知。

    LOW

    低优先级可以通知用户但又不是很紧急的事件。

    MIN

    用于后台消息 (例如天气或者位置信息)。最低优先级通知将只在状态栏显示图标,只有用户下拉通知抽屉才能看到内容。

    53cfffdf9d3dd320bf0e0854ddaa47b0.png对应属性(作用看上图就可知道):

    Notification.PRIORITY_DEFAULT

    Notification.PRIORITY_HIGH

    Notification.PRIORITY_LOW

    Notification.PRIORITY_MAX

    Notification.PRIORITY_MIN

    (7)方法:setOngoing(boolean ongoing)

    功能:设置为ture,表示它为一个正在进行的通知。他们通常是用来表示一个后台任务,用户积极参与(如播放音乐)或以某种方式正在等待,因此占用设备(如一个文件下载,同步操作,主动网络连接)

    (8)方法:setProgress(int max, int progress,boolean indeterminate)

    属性:max:进度条最大数值  、progress:当前进度、indeterminate:表示进度是否不确定,true为不确定,如下第3幅图所示  ,false为确定下第1幅图所示

    功能:设置带进度条的通知,可以在下载中使用

    效果图如下:

    progress_bar_summary.png 

    activity_indicator.png注意:此方法在4.0及以后版本才有用,如果为使用:如果为确定的进度条:调用setProgress(max,

    progress, false)来设置通知,在更新进度的时候在此发起通知更新progress,并且在下载完成后要移除进度条,通过调用setProgress(0,

    0, false)既可。

    操作结束时,调用setProgress(0,

    0, false)并更新通知以移除指示条

    第四步:设置通知栏PendingIntent(点击动作事件等都包含在这里)

    在第三步中,没有提到一个方法,就是setContentIntent(PendingIntentintent)这个方法,这里拿到这里讲。

    知识点

    1)什么是PendingIntent

    PendingIntent和Intent略有不同,它可以设置执行次数,主要用于远程服务通信、闹铃、通知、启动器、短信中,在一般情况下用的比较少。

    2)PendingIntent什么用

    Notification支持多种Intent来响应单击事件、消除事件、处理紧急状态的全屏事件等。

    这里就用到了setContentIntent(PendingIntent intent)来处理以上这么多的事件。

    3)相关属性和方法

    属性:

    PendingIntent的位标识符:

    FLAG_ONE_SHOT   表示返回的PendingIntent仅能执行一次,执行完后自动取消

    FLAG_NO_CREATE    表示如果描述的PendingIntent不存在,并不创建相应的PendingIntent,而是返回NULL

    FLAG_CANCEL_CURRENT     表示相应的PendingIntent已经存在,则取消前者,然后创建新的PendingIntent,这个有利于数据保持为最新的,可以用于即时通信的通信场景

    FLAG_UPDATE_CURRENT     表示更新的PendingIntent

    方法:

    6570a0b9df39788e0e4912ef4646fb5e.png

    可以看出,它支持多种相应方式,有Activity、Broadcast、Service,就根据你自身需求去选择。

    在各种情况下情况下它还会根据各种情况出发效果:

    contentIntent:在通知窗口区域,Notification被单击时的响应事件由该intent触发;

    deleteIntent:当用户点击全部清除按钮时,响应该清除事件的Intent;

    fullScreenIntent:响应紧急状态的全屏事件(例如来电事件),也就是说通知来的时候,跳过在通知区域点击通知这一步,直接执行fullScreenIntent代表的事件。

    例如:在执行了点击通知之后要跳转到指定的XXX的Activity的时候,可以设置以下方法来相应点击事件:

    Intent intent = new Intent(context,XXX.class);

    PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);

    mBuilder.setContentIntent(pendingIntent)

    例如:在执行了清空全部的通知操作时候,可以设置以下方法来相应这个事件:

    采用setDeleteIntent(PendingIntent intent)方法或按照以下写法

    Intent deleteIntent = new Intent();

    deleteIntent.setClass(context, XXXReceiver.class);

    deleteIntent.setAction(DELETE_ACTION);

    notification.deleteIntent = PendingIntent.getBroadcast(context, 0, deleteIntent, 0);

    例如:在响应紧急事件(如来电)时候,可以设置以下方法来相应这个事件:

    采用setFullScreenIntent(PendingIntent intent, boolean highPriority)

    第五步,最简单的一部,发送通知请求

    mNotificationManager.notify(notifyId, mBuilder.build());

    拓展

    实现自定义的通知栏效果:

    这里要用到RemoteViews这个类。实现以下2种自定义布局。

    注意:

    Notification的自定义布局是RemoteViews,和其他RemoteViews一样,在自定义视图布局文件中,仅

    支持FrameLayout、LinearLayout、RelativeLayout三种布局控件和AnalogClock、Chronometer、

    Button、ImageButton、ImageView、ProgressBar、TextView、ViewFlipper、ListView、

    GridView、StackView和AdapterViewFlipper这些显示控件,不支持这些类的子类或Android提供的其他控件。否则会

    引起ClassNotFoundException异常

    步骤如下:

    1)创建自定义视图

    2)获取远程视图对象(注:Notification的contentView不能为空)

    3)设置PendingIntent(来响应各种事件)

    4)发起Notification

    大体4步骤这里就不详细说了,下面就把DEMO中的列子拿出来说下

    样式:

    1.自定义带按钮通知栏(如下样式)

    “正在进行的”通知使用户了解正在运行的后台进程。例如,音乐播放器可以显示正在播放的音乐。也可以用来显示需要长时间处理的操作,例如下载或编码视频。“正在进行的”通知不能被手动删除。

    实现方法如下:

    /**

    * 带按钮的通知栏

    */

    public void showButtonNotify(){

    NotificationCompat.Builder mBuilder = new Builder(this);

    RemoteViews mRemoteViews = new RemoteViews(getPackageName(), R.layout.view_custom_button);

    mRemoteViews.setImageViewResource(R.id.custom_song_icon, R.drawable.sing_icon);

    //API3.0 以上的时候显示按钮,否则消失

    mRemoteViews.setTextViewText(R.id.tv_custom_song_singer, "周杰伦");

    mRemoteViews.setTextViewText(R.id.tv_custom_song_name, "七里香");

    //如果版本号低于(3。0),那么不显示按钮

    if(BaseTools.getSystemVersion() <= 9){

    mRemoteViews.setViewVisibility(R.id.ll_custom_button, View.GONE);

    }else{

    mRemoteViews.setViewVisibility(R.id.ll_custom_button, View.VISIBLE);

    }

    //

    if(isPlay){

    mRemoteViews.setImageViewResource(R.id.btn_custom_play, R.drawable.btn_pause);

    }else{

    mRemoteViews.setImageViewResource(R.id.btn_custom_play, R.drawable.btn_play);

    }

    //点击的事件处理

    Intent buttonIntent = new Intent(ACTION_BUTTON);

    /* 上一首按钮 */

    buttonIntent.putExtra(INTENT_BUTTONID_TAG, BUTTON_PREV_ID);

    //这里加了广播,所及INTENT的必须用getBroadcast方法

    PendingIntent intent_prev = PendingIntent.getBroadcast(this, 1, buttonIntent, PendingIntent.FLAG_UPDATE_CURRENT);

    mRemoteViews.setOnClickPendingIntent(R.id.btn_custom_prev, intent_prev);

    /* 播放/暂停  按钮 */

    buttonIntent.putExtra(INTENT_BUTTONID_TAG, BUTTON_PALY_ID);

    PendingIntent intent_paly = PendingIntent.getBroadcast(this, 2, buttonIntent, PendingIntent.FLAG_UPDATE_CURRENT);

    mRemoteViews.setOnClickPendingIntent(R.id.btn_custom_play, intent_paly);

    /* 下一首 按钮  */

    buttonIntent.putExtra(INTENT_BUTTONID_TAG, BUTTON_NEXT_ID);

    PendingIntent intent_next = PendingIntent.getBroadcast(this, 3, buttonIntent, PendingIntent.FLAG_UPDATE_CURRENT);

    mRemoteViews.setOnClickPendingIntent(R.id.btn_custom_next, intent_next);

    mBuilder.setContent(mRemoteViews)

    .setContentIntent(getDefalutIntent(Notification.FLAG_ONGOING_EVENT))

    .setWhen(System.currentTimeMillis())// 通知产生的时间,会在通知信息里显示

    .setTicker("正在播放")

    .setPriority(Notification.PRIORITY_DEFAULT)// 设置该通知优先级

    .setOngoing(true)

    .setSmallIcon(R.drawable.sing_icon);

    Notification notify = mBuilder.build();

    notify.flags = Notification.FLAG_ONGOING_EVENT;

    mNotificationManager.notify(notifyId, notify);

    }

    注意:带按钮的布局相应点击事件在3.0以下版本没有用,所以这边作了系统版本判断,来显示消失按钮。

    2.自定义不带按钮通知栏

    实现方法如下:

    //先设定RemoteViews

    RemoteViews view_custom = new RemoteViews(getPackageName(), R.layout.view_custom);

    //设置对应IMAGEVIEW的ID的资源图片

    view_custom.setImageViewResource(R.id.custom_icon, R.drawable.icon);

    //      view_custom.setInt(R.id.custom_icon,"setBackgroundResource",R.drawable.icon);

    view_custom.setTextViewText(R.id.tv_custom_title, "今日头条");

    view_custom.setTextViewText(R.id.tv_custom_content, "金州勇士官方宣布球队已经解雇了主帅马克-杰克逊,随后宣布了最后的结果。");

    之后调用:

    mBuilder.setContent(view_custom)

    来设定自定义的这个布局。

    实现:大视图风格通知(注:只在通知被展开时显示

    何时展开:通知处在顶端,或者用户通过收拾展开

    收件箱风格的通知:

    相比普通视图,只多出:7. 详情区域

    效果图如下:

    bigpicture_notification_callouts.png

    详情区域根据用途可有多种风格:

    1.NotificationCompat.BigPictureStyle 大图片风格:详情区域包含一个256dp高度的位图

    2.NotificationCompat.BigTextStyle 大文字风格:显示一个大的文字块

    3.NotificationCompat.InboxStyle  收件箱风格:显示多行文字

    各种风格都具有以下常规视图不具有的内容选项:

    1.大标题:在展开视图时替代普通视图的标记

    2.总结文字:允许你在详情区域之下增加一行内容

    拿收件箱风格为例,实现代码如下:

    NotificationCompat.BigPictureStyle inboxStyle = new NotificationCompat.InboxStyle();

    String[] events = new String[5];

    // Sets a title for the Inbox style big view

    inboxStyle.setBigContentTitle("大视图内容:");

    // Moves events into the big view

    for (int i=0; i 

    inboxStyle.addLine(events[i]);

    }

    mBuilder.setContentTitle("测试标题")

    .setContentText("测试内容")

    //              .setNumber(number)//显示数量

    .setStyle(inboxStyle)//设置风格

    .setTicker("测试通知来啦");

    开发中碰到的问题

    (注:下面所指的低版本是指2.3及2.3以下版本)

    1.如何取消掉通知栏上的通知

    (1)设置对应的flags,让用户点击既被消除:

    notification.flags = FLAG_AUTO_CANCEL;

    (2) 通过手动消除某项或则全部通知

    mNotificationMgr.cancle(NOTIFICATION_ID);//消除对应ID的通知

    mNotificationMgr.cancleAll();//消除创建的所有通知

    2.低版本中的部分方法已经被弃用的

    (1)Notification.Builder(this).getNotification()

    (2)mNotification.setLatestEventInfo(this, "title", "content", null);

    这些方法都已经被启用,虽然还有效果,可是不建议使用。所以开发过程中尽量使用NotificationCompat.Builder(this)的构建方法去创建一个通知类。

    3.低版本中会报的错误及解决方案:

    解决方案:如果在高版本不会出错,而在2.3上面报了这个错误,通过开发文档中的以下知道你可以找打:

    Activity in

    your app, and you should always start that

    设置contentIntent,如果你点击没有意图,可以在赋值的的Intent中设置为new

    Intent()既可,切记contentIntent不能为空。

    代码如下:

    public PendingIntent getDefalutIntent(int flags){

    PendingIntent pendingIntent= PendingIntent.getActivity(this, 1, new Intent(), flags);

    return pendingIntent;

    }

    (2)错误代

    码:android.app.RemoteServiceException: Bad notification posted from

    package com.example.notifications: Couldn't expand RemoteViews for:

    StatusBarNotification(package=com.example.notifications

    id=101 tag=null

    notification=Notification(vibrate=null,sound=null,defaults=0x0,flags=0x2))

    解决方法:

    4.低版本中,自定义的通知栏中如果带有按钮,可能按钮点击事件会失灵

    解决方法:看其它的应用,好像在低版本都会隐藏掉那些按钮,就是为了不影响用户体验,所以应该就这么解决,判断版本号在去决定是否现在按钮。

    5.低版本中,自定义布局中的字体颜色看不清

    如右图:

    34b16bfd9aa5f83199d9a28d4d001ed3.png

    解决方案:

    由于2.3及之前版本,背景设是白色的那我们定义字体颜色为系统预设的颜色:

    ?android:attr/textColorPrimary

    在资源的src/values目录中的style.xml文件中设置它标题和内容的样式为:

    ?android:attr/textColorPrimary

    ?android:attr/textColorPrimary

    bold

    在2.3之后的版本中(即API >=9的版本中),在资源文件下的src/values-v9目录中的style.xml文件中设置它标题和内容的样式为:

    最后赋给自定义布局中的对应标题和内容对应的style即可。

    对应解决网址:

    1.http://stackoverflow.com/questions/6250356/how-to-use-default-notification-style

    2.http://stackoverflow.com/questions/4867338/custom-notification-layouts-and-text-colors/7320604#7320604

    3.http://developer.android.com/guide/topics/ui/notifiers/notifications.html#CustomExpandedView   (官方文档)

    http://developer.android.com/about/versions/android-2.2-highlights.html

    6.低版本中mBuilder.setProgress(100, progress, false);没用,不显示进度条

    解决方法:此方法在4.0及以后版本才有用,如果为早期版本:需要自定义通知布局,其中包含ProgressBar视图

    7.自定义布局的时候,不同版本方法不一样。(弄了半天,在2.3版本不显示,原来是方法不兼容)

    2.3及2.3之前:

    通过

    Notification notify = mBuilder.build();

    notify.contentView = view_custom;

    mNotificationManager.notify(notifyId, notify)

    方法赋予VIEW。

    2.3之后:

    通过Builder以下方法赋于自定义布局。

    mBuilder.setContent(view_custom)

    这里就不贴DEMO中的代码了,大家可以下个DEMO自己看,里面也都有注释的,可能有的地方会有错误,忘大家指出,以便及时修改,谢谢。

    一个DEMO让你更懂Notification

    DEMO截图:

    7a53f4fa6895d7b1780c9aa163ee33df.png     

    4c4dc4ea3bc4e5765cf71a47ebe783b1.png 

    9f00ce2f318268d5912f0804ae68e827.png

    DEMO下载:下载地址

    展开全文
  • Android 通知栏自定义样式

    千次阅读 2019-11-10 17:40:56
    8.0系统的通知栏适配 在8.0之前我们通知栏的使用: notification = new NotificationCompat.Builder(mContext) .setWhen(System.currentTimeMillis()) .setSmallIcon(R.drawable.small_icon) ...

    8.0系统的通知栏适配

    在8.0之前我们通知栏的使用:

     notification = new NotificationCompat.Builder(mContext)
                        .setWhen(System.currentTimeMillis())
                        .setSmallIcon(R.drawable.small_icon)
    

    但如果SDK升级到8.0或者以上你会发现这个构建通知的方法已经废弃,并且无法显示通知,这是因为在8.0上引用了产商通道的概念,所以在8.0及以上构建通知的方法改为:

    NotificationManager  mNotificationManager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);
    int importance = NotificationManager.IMPORTANCE_HIGH;
    NotificationChannel mChannel = new NotificationChannel(channelId, channelName, importance);
    mNotificationManager.createNotificationChannel(mChannel);
    

    通知栏自定义样式

    自定义通知栏我们就要使用RemoteViews了,在SDK为16及以上才支持。

    private RemoteViews getContentBigView() {
            mRemoteViews = new RemoteViews(mContext, R.layout.view_baig_notify);
            return mRemoteViews;
        }
    

    自定义通知栏会有大图样式和小图样式即普通样式和扩展样式,高度上边会有要求限制,普通样式高度不能超过64dp,扩展高度不能超过256dp。
    今天我们主要讲一下大小图样式显示的适配。
    如果我们可爱的产品和设计妹子给到了优美的大图样式,那我们的设置方法如下:

     Notification notification = new NotificationCompat.Builder(mContext, id)
                        .setSmallIcon(R.drawable.small_icon)
                        .setWhen(System.currentTimeMillis())
                        .setContentIntent(getDefaultIntent(Notification.FLAG_ONGOING_EVENT))
                        .setCustomBigContentView(getContentBigView()
                        .setChannelId(mChannel.getId())
                        .build();
     mNotificationManager.notify(NOTIFICATION_ID, notification);
    

    在手机上运行一下,看到了大图样式那么好看,美滋滋的提交代码,提测给测试。but,,,测试拿着手机来告诉你通知栏大图样式显示不完整,what。。。拿起手机一看,真的是。。。 为什么自己手机上是可以的呢?天杀的通知栏适配,这个通知栏的高度不同的机型不同的room可能测绘出来的大小不同。
    仔细看了网易云音乐通知栏的样式,发现适配了默认样式和扩展样式,那么,我们就再适配一套默认样式吧。

    Notification notification = new NotificationCompat.Builder(mContext, id)
                        .setSmallIcon(R.drawable.small_icon)
                        .setWhen(System.currentTimeMillis())
                        .setContentIntent(getDefaultIntent(Notification.FLAG_ONGOING_EVENT))
                        .setCustomContentView(getContentView())
                        .setCustomBigContentView(getContentBigView()
                        .setChannelId(mChannel.getId())
                        .build();
     mNotificationManager.notify(NOTIFICATION_ID, notification);
    
    private RemoteViews getContentView() {
            mRemoteViews = new RemoteViews(mContext, R.layout.view_notify);
            return mRemoteViews;
        }
    

    上图,画质有些渣。。。
    如图,画质有些渣。。。
    这样,通知栏的样式适配就完成了,当然还有一些背景颜色和字体颜色的适配,这里就不展开讲了。
    点击这里获取demo

    展开全文
  • 1.通知栏制作全过程(含多个PendingIntent,即:可跳转到多个activity) 2.可产生isChecked的组件ToggleButton可添加setOnCheckedChangeListener事件,处理checked事件 学习分享: 1.通知栏制作过程 第一步:初始化 ...

    工作内容:

    1.通知栏制作全过程(含多个PendingIntent,即:可跳转到多个activity)

    2.可产生isChecked的组件ToggleButton可添加setOnCheckedChangeListener事件,处理checked事件

    学习分享:

    1.通知栏制作过程

    第一步:初始化

    //添加通知栏信息
        public void startNotification(){
            //初始化NotificationManager
            manager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
            //生成意图intent对象
            intentHome = new Intent(this,HomeActivity.class);
    //        intentHome = new Intent("azsecuer.androidy.com.mobelmanager.activity.HomeActivity");
            intentYellowPage = new Intent(this,YellowPageActivity.class);
            /**
             * 对于intent生成2个对应的pendingintent
             * pendingIntentHome,pendingIntentYellowPage最后一个参数可以为0,不影响
             */
            pendingIntentHome = PendingIntent.getActivity(this,0,intentHome,PendingIntent.FLAG_CANCEL_CURRENT);
            pendingIntentYellowPage = PendingIntent.getActivity(this,0,intentYellowPage,PendingIntent.FLAG_CANCEL_CURRENT);
            //初始化RemoteViews的对象
            remoteViews = new RemoteViews(this.getPackageName(),R.layout.layout_notificationbar);
            /**
             * 添加监听事件
             * 参数一:package
             * 参数二:pendingIntent
             */
            remoteViews.setOnClickPendingIntent(R.id.linear_notificationbar,pendingIntentHome);
            remoteViews.setOnClickPendingIntent(R.id.image_yellowpage_notificationbar,pendingIntentYellowPage);
            //初始化notification
            notification = new Notification.Builder(this)
                    .setTicker("手机管家有新消息")  //必要条件,提示信息
    //                .setContentTitle("手机管家")		//标题
    //                .setContentText("点击进入手机管家主页面")	//内容
                    .setSmallIcon(R.drawable.ic_launcher)   //必要条件,提示图标
    //                .setContentIntent(pendingIntentHome)
    //                .setAutoCancel(true)    //设置notification可以自动消失
                    .setContent(remoteViews)
                    .build();	//Android版本在11-16之间用.getNotification();
    //        notification.flags |= Notification.FLAG_AUTO_CANCEL;//使通知栏可以自动消失——无效
    //        notification.flags = Notification.FLAG_NO_CLEAR;//如果不调用manager.cancel,通知栏不会消失
        }
    第二步:调用方法生成通知栏
    参数NOTID是一个自定义int常量
    
    manager.notify(NOTID,notification);
    第三步:调用方法使通知栏消失
    manager.cancel(NOTID);
    2.实现OnCheckedChangeListener,可以处理ToggleButton事件

    展开全文
  • Android 播放器通知栏样式适配

    千次阅读 2017-07-31 23:32:12
    根据系统主题,适配不同手机的通知栏...
  • Android各种样式通知栏

    2018-07-30 22:20:20
    各种样式通知栏,以及不同版本的兼容性的版本,还有自定义的QQ悬浮窗通知栏以及前台服务类型的通知栏
  • import android.app.Application;import android.app.NotificationChannel;import android.app.NotificationManager;import android.os.Build;import java.util.ArrayList;import java.util.HashMap;import java.uti...
  • Android通知栏消息、点亮屏幕、震动、声音、显示样式的小例子。
  • 当app让系统发送一个消息的时候,消息首先以图表的形式显示在通知栏。要查看消息的详情需要进入通知抽屉(notificationdrawer)中查看。(notificationdrawer)都是系统层面控制的,你可以随时查看,不限制于app。...
  • Android 通知栏

    2018-07-31 18:13:55
    主要是通过NotificationManager的notify方法来实现的,当然如果只是通知的话可能我们使用默认效果就可以完成我们想要的效果,但是当我们要在通知栏控制音乐的播放就要使用自定义的通知栏样式了,这样我们就要使用到...
  •  这段时间公司项目功能涉及到下载apk,在通知栏中显示下载进度,其中通知栏中进度条需要自定义。  1.效果  底图push_download_progress_bg.9.png和进度图push_download_progress.9.png  效果  2.通知...
  • 使用RemoteViews自定义通知栏样式

    千次阅读 2016-08-18 16:03:16
    使用RemoteViews自定义通知栏样式标签(空格分隔): 菜鸟 android使用RemoteViews自定义通知栏样式 一普通通知栏 处理点击事件 二使用RemoteViews替换普通通知栏 处理点击事件 三RemoteViews如何更新View 一、普通...
  • Android 音乐APP 显示专辑图片前言正文① 显示专辑封面图片② 后台播放结语 前言   近段时间,写作的时间没有那么多,之前的项目要改动一些功能,所以这个文章也是断断续续才写好,好在我还没有忘记这个事情,写...
  • 使用RemoteViews自定义通知栏样式 标签(空格分隔): 菜鸟 Android 使用RemoteViews自定义通知栏样式 一普通通知栏 处理点击事件 二使用RemoteViews替换普通通知栏 处理点击事件 三...

空空如也

空空如也

1 2 3 4 5 ... 12
收藏数 224
精华内容 89
关键字:

android通知栏样式