Android P通知

时间:2020-02-23 14:29:08  来源:igfitidea点击:

在本教程中,我们将讨论在通知系统及其Android P用户界面中引入的更改。
我们将通过一个简单的Android应用程序进行演示。

Android P通知

Android Pie引入了新的消息样式通知UI,该UI提供了简化的对话。
而且,我们现在也可以以消息传递样式显示带有文本的图像。

在Android P中,MessagingStyle类的addMessage()函数已更改。
现在,我们没有传递字符串,而是传递了" Person"对象,该对象将通知及其消息绑定到该人。

setData用于在消息上显示图像。

setSemanticAction用于设置对通知动作的预定义引用。

以下是可用的语义动作:

  • SEMANTIC_ACTION_NONE
  • SEMANTIC_ACTION_REPLY
  • SEMANTIC_ACTION_MARK_AS_READ
  • SEMANTIC_ACTION_MARK_AS_UNREAD
  • SEMANTIC_ACTION_DELETE
  • SEMANTIC_ACTION_ARCHIVE
  • SEMANTIC_ACTION_MUTE
  • SEMANTIC_ACTION_UNMUTE
  • SEMANTIC_ACTION_THUMBS_UP
  • SEMANTIC_ACTION_THUMBS_DOWN
  • SEMANTIC_ACTION_CALL

setGroupConversation用于将通知组标识为对话。

在下一节中,我们将在Android P中实现不同类型的通知。

简单消息通知

private void simpleNotification() {
      Person jd = new Person.Builder()
              .setName("theitroad")
              .setImportant(true)
              .build();

      new NotificationCompat.MessagingStyle(jd)
              .addMessage("Check me out", new Date().getTime(), jd)
              .setBuilder(builder);

      notificationManager.notify(1, builder.build());
  }

在addMessage内部,我们传递消息,time(long)和Person对象。
setImportant true表示如果该通知被折叠,则该消息将显示在对话的顶部。

带图标的消息通知

默认情况下,显示的图标是"人员"的首字母。
我们可以如下所示设置自定义图标:

Person anupam = new Person.Builder()
              .setName("Anupam")
              .setIcon(IconCompat.createWithResource(this, R.drawable.sample_photo))
              .setImportant(true)
              .build();

      new NotificationCompat.MessagingStyle(anupam)
              .addMessage("Check out my latest article!", new Date().getTime(), anupam)
              .setBuilder(builder);

      notificationManager.notify(2, builder.build());

带有图像的通知

我们可以在setData方法中设置图像类型和uri,如下所示:

private void notificationWithImage() {
      Person bot = new Person.Builder()
              .setName("Bot")
              .setImportant(true)
              .setBot(true)
              .build();

      Uri uri = Uri.parse("android.resource://com.theitroad.androidpnotifications/drawable/"+R.drawable.sample_bg);

      NotificationCompat.MessagingStyle.Message message = new NotificationCompat.MessagingStyle.Message("Check out my latest article!", new Date().getTime(), bot);
      message.setData("image/*",uri);

      new NotificationCompat.MessagingStyle(bot)
              .addMessage(message)
              .setGroupConversation(true)
              .setBuilder(builder);

      notificationManager.notify(3, builder.build());
  }

将setBot设置为true表示Person类型是机器。

消息对话通知

private void notificationWithGroupConvo()
  {

      Person jd = new Person.Builder()
              .setName("theitroad")
              .build();

      Person anupam = new Person.Builder()
              .setName("Anupam")
              .setIcon(IconCompat.createWithResource(this, R.drawable.sample_photo))
              .setImportant(true)
              .build();

      Person bot = new Person.Builder()
              .setName("Bot")
              .setBot(true)
              .build();

      Uri uri = Uri.parse("android.resource://com.theitroad.androidpnotifications/drawable/"+R.drawable.sample_bg);

      NotificationCompat.MessagingStyle.Message message = new NotificationCompat.MessagingStyle.Message("", new Date().getTime(), bot);
      message.setData("image/*",uri);

      new NotificationCompat.MessagingStyle(bot)
              .addMessage("Hi. How are you?", new Date().getTime(), anupam)
              .addMessage(message)
              .addMessage("Does this image look good?", new Date().getTime(), bot)
              .addMessage("Looks good!", new Date().getTime(), jd)
              .setGroupConversation(true)
              .setConversationTitle("Sample Conversation")
              .setBuilder(builder);

      notificationManager.notify(4, builder.build());

  }

消息按照设置" addMessage"方法的顺序显示。

在以下部分中,我们将汇总以上学习的概念以及语义动作。
我们将使用AndroidX包装系统。

项目结构

Android P通知项目

代码

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

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
  android:orientation="vertical"
  android:gravity="center"
  tools:context=".MainActivity">

  <Button
      android:id="@+id/btnSimpleNotification"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Simple Notification" 

  <Button
      android:id="@+id/btnNotificationIcon"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Notification With Icon" 

  <Button
      android:id="@+id/btnNotificationImage"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Notification With Image" 

  <Button
      android:id="@+id/btnNotificationWithGroupConvo"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Notification With Group Conversation" 

  <Button
      android:id="@+id/btnNotificationSemantic"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Notification Semantic Action" 

</LinearLayout>

MainActivity.java类的代码如下:

package com.theitroad.androidpnotifications;

import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import androidx.core.app.NotificationCompat;

import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.Person;
import androidx.core.graphics.drawable.IconCompat;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import java.util.Date;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

  NotificationManager notificationManager;
  NotificationCompat.Builder builder;
  NotificationChannel channel;

  CharSequence charSequence = "";

  @Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);

      Button btnSimpleNotification = findViewById(R.id.btnSimpleNotification);
      Button btnNotificationIcon = findViewById(R.id.btnNotificationIcon);
      Button btnNotificationImage = findViewById(R.id.btnNotificationImage);
      Button btnNotificationWithGroupConvo = findViewById(R.id.btnNotificationWithGroupConvo);
      Button btnNotificationSemantic = findViewById(R.id.btnNotificationSemantic);

      charSequence = btnNotificationIcon.getText();

      btnSimpleNotification.setOnClickListener(this);
      btnNotificationIcon.setOnClickListener(this);
      btnNotificationImage.setOnClickListener(this);
      btnNotificationWithGroupConvo.setOnClickListener(this);
      btnNotificationSemantic.setOnClickListener(this);

      notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
      CharSequence name = "My Notification";
      String description = "yadda yadda";
      int importance = NotificationManager.IMPORTANCE_DEFAULT;

      channel = new NotificationChannel("1", name, importance);
      channel.setDescription(description);

      builder = new NotificationCompat.Builder(MainActivity.this, channel.getId())
                      .setSmallIcon(R.mipmap.ic_launcher);

      notificationManager.createNotificationChannel(channel);

  }

  @Override
  public void onClick(View v) {

      switch (v.getId()) {
          case R.id.btnSimpleNotification:
              simpleNotification();
              break;
          case R.id.btnNotificationIcon:
              notificationWithIcon();
              break;
          case R.id.btnNotificationImage:
              notificationWithImage();
              break;

          case R.id.btnNotificationWithGroupConvo:
              notificationWithGroupConvo();
              break;

          case R.id.btnNotificationSemantic:
              notificationSemantic();
              break;

      }
  }

  private void simpleNotification() {
      Person jd = new Person.Builder()
              .setName("theitroad")
              .setImportant(true)
              .build();

      new NotificationCompat.MessagingStyle(jd)
              .addMessage("Check me out", new Date().getTime(), jd)
              .setBuilder(builder);

      notificationManager.notify(1, builder.build());
  }

  private void notificationWithIcon() {
      Person anupam = new Person.Builder()
              .setName("Anupam")
              .setIcon(IconCompat.createWithResource(this, R.drawable.sample_photo))
              .setImportant(true)
              .build();

      new NotificationCompat.MessagingStyle(anupam)
              .addMessage("Check out my latest article!", new Date().getTime(), anupam)
              .setBuilder(builder);

      notificationManager.notify(2, builder.build());
  }

  private void notificationWithImage() {
      Person bot = new Person.Builder()
              .setName("Bot")
              .setImportant(true)
              .setBot(true)
              .build();

      Uri uri = Uri.parse("android.resource://com.theitroad.androidpnotifications/drawable/"+R.drawable.sample_bg);

      NotificationCompat.MessagingStyle.Message message = new NotificationCompat.MessagingStyle.Message("Check out my latest article!", new Date().getTime(), bot);
      message.setData("image/*",uri);

      new NotificationCompat.MessagingStyle(bot)
              .addMessage(message)
              .setGroupConversation(true)
              .setBuilder(builder);

      notificationManager.notify(3, builder.build());
  }

  private void notificationWithGroupConvo()
  {

      Person jd = new Person.Builder()
              .setName("theitroad")
              .build();

      Person anupam = new Person.Builder()
              .setName("Anupam")
              .setIcon(IconCompat.createWithResource(this, R.drawable.sample_photo))
              .setImportant(true)
              .build();

      Person bot = new Person.Builder()
              .setName("Bot")
              .setBot(true)
              .build();

      Uri uri = Uri.parse("android.resource://com.theitroad.androidpnotifications/drawable/"+R.drawable.sample_bg);

      NotificationCompat.MessagingStyle.Message message = new NotificationCompat.MessagingStyle.Message("", new Date().getTime(), bot);
      message.setData("image/*",uri);

      new NotificationCompat.MessagingStyle(bot)
              .addMessage("Hi. How are you?", new Date().getTime(), anupam)
              .addMessage(message)
              .addMessage("Does this image look good?", new Date().getTime(), bot)
              .addMessage("Looks good!", new Date().getTime(), jd)
              .setGroupConversation(true)
              .setConversationTitle("Sample Conversation")
              .setBuilder(builder);

      notificationManager.notify(4, builder.build());

  }

  private void notificationSemantic()
  {

      Person jd = new Person.Builder()
              .setName("theitroad")
              .build();

      Person anupam = new Person.Builder()
              .setName("Anupam")
              .setIcon(IconCompat.createWithResource(this, R.drawable.sample_photo))
              .setImportant(true)
              .build();

      Person bot = new Person.Builder()
              .setName("Bot")
              .setBot(true)
              .build();

      Uri uri = Uri.parse("android.resource://com.theitroad.androidpnotifications/drawable/"+R.drawable.sample_bg);

      Intent intent = new Intent(this, MainActivity.class);
      intent.putExtra("hi","Notifications were read");
      PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0);

      NotificationCompat.MessagingStyle.Message message = new NotificationCompat.MessagingStyle.Message("", new Date().getTime(), bot);
      message.setData("image/*",uri);

      NotificationCompat.Action replyAction =
              new NotificationCompat.Action.Builder(
                      R.drawable.sample_bg,
                      "MARK READ",
                      pendingIntent)
                      .setSemanticAction(NotificationCompat.Action.SEMANTIC_ACTION_MARK_AS_READ)
                      .build();

      NotificationCompat.Builder separateBuilder = builder;
      separateBuilder.addAction(replyAction);

      new NotificationCompat.MessagingStyle(bot)
              .addMessage("Hi. How are you?", new Date().getTime(), anupam)
              .addMessage(message)
              .addMessage("Does this image look good?", new Date().getTime(), bot)
              .addMessage("Looks good!", new Date().getTime(), jd)
              .setGroupConversation(true)
              .setConversationTitle("Sample Conversation")
              .setBuilder(separateBuilder);

      notificationManager.notify(5, separateBuilder.build());

  }

  @Override
  protected void onResume() {
      super.onResume();

      if(getIntent()!=null && getIntent().getExtras()!=null)
      {
          String value = getIntent().getStringExtra("hi");
          Toast.makeText(getApplicationContext(),value,Toast.LENGTH_LONG).show();
      }
  }
}

单击语义动作按钮时,我们将在Toast中显示意图数据。