Android Q Bubbles

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

在本教程中,我们将介绍Android Q引入的一项新功能,即Bubbles。
我们今天将在我们的Android应用程序中实现它。

Android Q Bubbles

我们都已经看到了Facebook聊天气泡的工作原理。
快来看看Android Q,现在我们有了一个内置的通知系统,可以从通知气泡中打开应用程序屏幕的预览。
此外,我们可以执行多任务并在不同气泡之间切换。

设备锁定后,将不会显示气泡。
仅显示普通通知。
气泡是一项可选功能。
首次显示时,我们可以选择允许/禁止气泡。
否则,我们可以从设置中执行相同的操作。

气泡在浮动窗口中显示内容。

Android Q通知气泡权限

气泡如何实施?

为了在我们的Notification中实现Bubbles,我们必须使用Builder来设置Bubble元数据,并使用setBubbleMetadata()在Notification上进行设置。

为了使活动从气泡中打开,我们需要在列表文件中将其定义为:

<activity
          android:name=".BubbleActivity"
          android:label="@string/title_activity_bubble"
          android:allowEmbedded="true"
          android:documentLaunchMode="always"
          android:resizeableActivity="true"
          android:theme="@style/AppTheme.NoActionBar"

创建气泡元数据:

Notification.BubbleMetadata bubbleData =
  new Notification.BubbleMetadata.Builder()
      .setDesiredHeight(600)
      .setIntent(bubbleIntent)
      .setAutoExpandBubble(true)
      .setSuppressInitialNotification(true)
      .build();

默认情况下,您需要单击气泡以显示内容。
但是您始终可以通过设置方法setAutoExpand(true)和setSuppressInitialNotification(true)来自动扩大气泡。

气泡中显示的活动的生命周期与正常生命周期相同。
每次消除气泡,该活动就会被杀死。

为了显示气泡,必须在" NotificationChannel"中传递" IMPORTANCE HIGH"。

NotificationChannel有一个方法canBubble()方法。
您可以使用它来确定是否可以为该通知通道显示气泡或者是否将其禁用。

可以在NotificationChannel上将setAllowBubbles()设置为true,以便为此NotificationChannel组显示气泡。

在NotificationManager类中添加了PRO-TIPʻareBubblesAllowed()`。
可以将它与canBubble一起使用,以检查是否允许气泡。

在以下部分中,我们将创建一个演示Android Bubbles的简单应用程序。
我们将使用AndroidX。

项目结构

Android Q Bubble项目结构

代码

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

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:orientation="vertical"
  android:gravity="center"
  android:layout_height="match_parent">

  <Button
      android:id="@+id/btnBubble"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Create Bubble" 

  <Button
      android:id="@+id/btnBubble2"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Another Bubble" 

</LinearLayout>

MainActivity.java类的代码如下:

package com.theitroad.androidqbubbles;

import androidx.appcompat.app.AppCompatActivity;
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;

import android.content.Context;
import android.content.Intent;
import android.graphics.drawable.Icon;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

  Button btnBubble, btnBubble2;

  NotificationManager notificationManager;
  Notification.Builder builder;
  NotificationChannel channel;

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

      btnBubble = findViewById(R.id.btnBubble);
      btnBubble2 = findViewById(R.id.btnBubble2);

      notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

      CharSequence name = "My Channel";
      String description = "xyz";
      int importance = NotificationManager.IMPORTANCE_HIGH;

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

      btnBubble.setOnClickListener(this);
      btnBubble2.setOnClickListener(this);
  }

  @Override
  public void onClick(View view) {

      switch (view.getId())
      {
          case R.id.btnBubble:
              Intent target = new Intent(MainActivity.this, BubbleActivity.class);
              PendingIntent bubbleIntent =
                      PendingIntent.getActivity(MainActivity.this, 0, target, PendingIntent.FLAG_UPDATE_CURRENT /* flags */);

              //Create bubble metadata
              Notification.BubbleMetadata bubbleData =
                      new Notification.BubbleMetadata.Builder()
                              .setDesiredHeight(600)
                              .setIcon(Icon.createWithResource(MainActivity.this, R.mipmap.ic_launcher))
                              .setIntent(bubbleIntent)
                              .build();

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

              notificationManager.createNotificationChannel(channel);
              notificationManager.notify(1, builder.build());
              break;
          case R.id.btnBubble2:
              target = new Intent(MainActivity.this, BubbleActivity.class);
              target.putExtra("key","This is the second bubble");
              bubbleIntent =
                      PendingIntent.getActivity(MainActivity.this, 0, target, PendingIntent.FLAG_UPDATE_CURRENT);

              //Create bubble metadata
              bubbleData = new Notification.BubbleMetadata.Builder()
                              .setDesiredHeight(600)
                              .setIcon(Icon.createWithResource(MainActivity.this, R.mipmap.ic_launcher))
                              .setIntent(bubbleIntent)
                              .build();

              builder = new Notification.Builder(MainActivity.this, channel.getId())
                      .setContentTitle("Second Bubble")
                      .setSmallIcon(R.mipmap.ic_launcher)
                      .setBubbleMetadata(bubbleData);

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

              break;
      }

  }
}

注意:编写本教程时,仿真器无法显示图标。
Beta 2即将发布时,即将在Android Q中进行的更新应对此进行纠正。

我们使用"基本活动"模板创建了另一个活动。

下面给出了BubbleActivity.java的代码:

package com.theitroad.androidqbubbles;

import android.os.Bundle;

import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.snackbar.Snackbar;

import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import android.view.View;
import android.widget.TextView;

public class BubbleActivity extends AppCompatActivity {

  TextView textView;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_bubble);
      Toolbar toolbar = findViewById(R.id.toolbar);
      setSupportActionBar(toolbar);

      textView = findViewById(R.id.textView);

      FloatingActionButton fab = findViewById(R.id.fab);
      fab.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View view) {
              Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                      .setAction("Action", null).show();
          }
      });

  }

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

      if (getIntent() != null && getIntent().getExtras() != null) {

          String value = getIntent().getStringExtra("key");
          textView.setText(value);
      }
  }
}

其中我们基于Notification的PendingIntent结果更新TextView。

注意:不要忘了将BubbleActivity添加到列表中,该列表具有本教程开头讨论的正确属性。

上面应用程序的输出如下:

Android Q通知气泡输出

如您所见,我们能够在显示为浮动窗口的BubbleActivity中执行所有操作。