Android 多媒体(一)——使用通知

通知可以在活动、广播接收器,服务里创建

一、通知基本用法

  1. Context.getSystemService(Context.NOTIFICATION_SERVICE)获取到NotificationManager对通知管理:
NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE)
  1. Builder构造器创建Notification对象,channelId用来表示消息通道的ID,自定义一个填上即可
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, "unique");
  1. 基本设置
builder.setContentTitle("这是标题")
       .setAutoCancel(true)
       .setContentText("这是文本")
       .setContentInfo("这是内容")
       .setSubText("这是小字")
       .setTicker("滚动消息......")
       .setWhen(System.currentTimeMillis()) // 出现时间
       .setSmallIcon(R.mipmap.ic_launcher) //小图标
       .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher)); // 大图标
 // 大于Android 8.0的版本适配
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
    NotificationChannel notificationChannel = null;
    notificationChannel = new NotificationChannel("unique", "TEST", NotificationManager.IMPORTANCE_HIGH);
    notificationChannel.enableLights(true); //LED灯
    notificationChannel.setLightColor(Color.YELLOW);
	manager.createNotificationChannel(notificationChannel);
 }
  1. 显示通知,第一个参数是自定义的id,第二个参数是对象
Notification notification = builder.build();
manager.notify(1, notification);

新建一个空项目 day14_NotificationTest

主布局:

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

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/send_notice"
        android:text="发起通知"/>

</LinearLayout>

主活动:

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

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

        Button button_sendNotice = findViewById(R.id.send_notice);
        button_sendNotice.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.send_notice:
                Intent intent = new Intent(this, NotificationActivity.class);
                PendingIntent pi = PendingIntent.getActivity(this, 0, intent, 0);
                NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
                NotificationCompat.Builder builder = new NotificationCompat.Builder(this, "unique");
                builder.setContentTitle("这是标题")
                        .setAutoCancel(true)
                        .setContentText("这是文本")
                        .setContentInfo("这是内容")
                        .setSubText("这是小字")
                        .setTicker("滚动消息......")
                        .setWhen(System.currentTimeMillis()) // 出现时间
                        .setSmallIcon(R.mipmap.ic_launcher) //小图标
                        .setContentIntent(pi)  //大图标
                        .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher)); // 大图标
                Notification notification = builder.build();
                manager.notify(1, notification);
                break;
            default:
                break;
        }
    }
}

在这里插入图片描述

三、通知的响应

通知响应依赖于PendingIntent,分别用于活动,广播,和服务,其对应静态方法:getActivity(),getBroadcast(),getService()

  • 第一个参数:Context
  • 第二个参数:通常直接写0
  • 第三个参数:Intent
  • 第四个参数:可以选择四个:FLAG_ONE_SHOTFLAG_NO_CREATEFLAG_CANCEL_CURRENTFLAG_UPDATE_CURRENT。但通常写0

新建一个空活动 NotificationActivity,对应布局notification_layout

通知布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:textSize="24sp"
        android:text="这一页是通知布局"/>

</RelativeLayout>

主活动给通知加入点击功能:

    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.send_notice:
                Intent intent = new Intent(this, NotificationActivity.class);
                PendingIntent pi = PendingIntent.getActivity(this, 0, intent, 0);
                NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
                NotificationCompat.Builder builder = new NotificationCompat.Builder(this, "001");
                builder.setContentTitle("这是标题")
                        .setContentText("这是文本")
                        .setContentInfo("这是内容")
                        .setSubText("这是小字")
                        .setTicker("滚动消息......")
                        .setWhen(System.currentTimeMillis())
                        .setSmallIcon(R.mipmap.ic_launcher)
                        .setContentIntent(pi)
                        .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher));
                        。。。。。。

运行:
在这里插入图片描述
让通知消失的两种方法:

  1. NotificationCompat.Builder中连缀一个setAutoCancel(true)方法,通知被点击后就会自动清除:
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, "001").setAutoCancel(true);
  1. 显示调用NotificationMangercancel()将它取消:
public class NotificationActivity extends AppCompatActivity {

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

        NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        manager.cancel(1);
    }
}

这里的 1,是通知的id,之前设置好的。

四、通知的进阶技巧

设置通知的音效:

builder.setSound(Uri.fromFile(new File("铃声路径")));

设置振动【偶数表示振动的毫秒数,奇数表示接着静止的毫秒数】:

builder.setVibrate(new long[]{0, 1000, 1000, 1000});
// 8.0 以上要添加这个:
channel.setVibrationPattern(pattern);

不过设置振动需要先添加权限:

<uses-permission android:name="android.permission.VIBRATE"/>

显示长文字:

builder.setStyle(new NotificationCompat.BigTextStyle().bigText("唧唧复唧唧,木兰当户织。不闻机杼声,惟闻女叹息。\n" +
                                "问女何所思,问女何所忆。女亦无所思,女亦无所忆。昨夜见军帖,可汗大点兵,军书十二卷,卷卷有爷名。阿爷无大儿,木兰无长兄,愿为市鞍马,从此替爷征。\n" +
                                "东市买骏马,西市买鞍鞯,南市买辔头,北市买长鞭。旦辞爷娘去,暮宿黄河边,不闻爷娘唤女声,但闻黄河流水鸣溅溅。旦辞黄河去,暮至黑山头,不闻爷娘唤女声,但闻燕山胡骑鸣啾啾。\n" +
                                "万里赴戎机,关山度若飞。朔气传金柝,寒光照铁衣。将军百战死,壮士十年归。\n" +
                                "归来见天子,天子坐明堂。策勋十二转,赏赐百千强。可汗问所欲,木兰不用尚书郎,愿驰千里足,送儿还故乡。\n" +
                                "爷娘闻女来,出郭相扶将;阿姊闻妹来,当户理红妆;小弟闻姊来,磨刀霍霍向猪羊。开我东阁门,坐我西阁床,脱我战时袍,著我旧时裳。当窗理云鬓,对镜帖花黄。出门看火伴,火伴皆惊忙:同行十二年,不知木兰是女郎。\n" +
                                "雄兔脚扑朔,雌兔眼迷离;双兔傍地走,安能辨我是雄雌?"))

在这里插入图片描述
显示图片:

builder.setStyle(new NotificationCompat.BigPictureStyle().bigPicture(BitmapFactory.decodeResource(getResources(), R.drawable.cat)))

在这里插入图片描述
设置重要程度:

builder.setPriority(NotificationCompat.PRIORITY_MAX)
发布了166 篇原创文章 · 获赞 14 · 访问量 9111

猜你喜欢

转载自blog.csdn.net/qq_41205771/article/details/104251092