今天学习了 Notification 通知的使用,来记录一下我的学习历程。
先来看我项目结构
运行结果展示
Notification Android Studio 演示
Maintivity代码如下
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.media.AudioAttributes;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.NotificationCompat;
import java.io.File;
public class MainActivity extends AppCompatActivity {
final int NOTIFYID=0x110; //通知ID
private NotificationManager notificationManager;
private Notification notification;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btn = findViewById(R.id.btn);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
choujiang();
}
});
}
//抽奖函数
private void choujiang() {
Intent intent = new Intent(MainActivity.this,DetailActivity.class); //设置点击通知跳转
PendingIntent pendingIntent = PendingIntent.getActivity(MainActivity.this,0,intent,0);
notificationManager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE); //创建通知管理类对象
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){ //判断SDK版本,SDK>=26时,可以进行相应设置
NotificationChannel channel = new NotificationChannel("iu", "测试通知", NotificationManager.IMPORTANCE_HIGH);
//第三个参数是设置优先级,NotificationManager.IMPORTANCE_HIGH是通知会弹出,发出提示音,状态栏中显示
/*
IMPORTANCE_NONE 关闭通知
IMPORTANCE_MIN 开启通知,不会弹出,但没有提示音,状态栏中无显示
IMPORTANCE_LOW 开启通知,不会弹出,不发出提示音,状态栏中显示
IMPORTANCE_DEFAULT 开启通知,不会弹出,发出提示音,状态栏中显示
IMPORTANCE_HIGH 开启通知,会弹出,发出提示音,状态栏中显示
*/
channel.setShowBadge(true); //显示通知角标(圆点角标)
channel.enableLights(true);//设置通知出现时的闪灯
//设置提示铃声
channel.setSound(Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.a), new AudioAttributes.Builder().build());
channel.setVibrationPattern(new long[]{1500,1500,500,500}); //设置振动,意思是延迟1秒,然后震动1500ms,再延迟500ms,接着震动500ms。
notificationManager.createNotificationChannel(channel); //将创建的NotificationChannel对象放入通知管理类中
}
//由于API不同会出现很多我无法理解的bug, 所以这里使用NotificationCompat类来兼容各个版本。
notification = new NotificationCompat.Builder(MainActivity.this,"iu")
.setContentTitle("来自骗子的通知") //设置标题
.setContentText("恭喜您中了100万大奖") //设置文本
.setSmallIcon(R.drawable.q) //设置小图标
.setLargeIcon(BitmapFactory.decodeResource(getResources(),R.drawable.huaji)) //设置大图标
.setContentIntent(pendingIntent)
/*.setStyle(new NotificationCompat.BigTextStyle().bigText("这是一段很长的文字很长很长很长很长很长很长很" +
"长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长" +
"很长很长很长很长很长很长很长很长很长很长")) //显示完全的内容文本*/
.setStyle(new NotificationCompat.BigPictureStyle().bigPicture(BitmapFactory.decodeResource(getResources(), R.drawable.huaji))) //设置带有图片消息
//.setPriority(NotificationCompat.PRIORITY_MAX) //设置消息的重要程度
/* PRIORITY_DEFAULT:表示默认重要程度,和不设置效果一样
PRIORITY_MIN:表示最低的重要程度。系统只会在用户下拉状态栏的时候才会显示
PRIORITY_LOW:表示较低的重要性,系统会将这类通知缩小,或者改变显示的顺序,将排在更重要的通知之后。
PRIORITY_HIGH:表示较高的重要程度,系统可能会将这类通知方法,或改变显示顺序,比较靠前
PRIORITY_MAX:最重要的程度, 会弹出一个单独消息框,让用户做出相应。
*/
.setSound(Uri.fromFile(new File("/system/media/audio/ringtones/xxx.ogg"))) //设置通知提示音
.setVibrate(new long[]{1500,1500,500,500}) //设置振动,意思是延迟1秒,然后震动1500ms,再延迟500ms,接着震动500ms
// 需要添加权限 <uses-permission android:name="android.permission.VIBRATE"/>
.setLights(Color.GREEN,1500,1500)//设置前置LED灯进行闪烁, 第一个为颜色值 第二个为亮的时长 第三个为暗的时长
.setDefaults(NotificationCompat.DEFAULT_ALL) //使用默认效果, 如果setDefaults的属性设置的是Notification.DEFAULT_ALL或者Notification.DEFAULT_VISIBLE,setVibrate将无效,
// 因为Notification.DEFAULT_ALL或者Notification.DEFAULT_VISIBLE会替代setVibrate。
// 会根据手机当前环境播放铃声和是否振动
//.setSubText("我是一个SubText") //在通知上新增一行文本,使原本两行文本变成三行文本
//.setTimeoutAfter(6000) //设置超时之后自动取消。
.setAutoCancel(true) //设为true,点击通知后通知会自动取消,需要重点注意的是,setAutoCancel需要和setContentIntent一起使用,否则无效。
.setWhen(System.currentTimeMillis()) //在通知栏信息里显示系统获取到的时间
.setShowWhen(true) //设置是否显示当前时间
.build();
notificationManager.notify(123,notification); //调用notify()让通知显示出来(第一个参数是ID, 保证每个通知所指定的id都是不同的,第二个参数是notification对象)
}
}
说明:几乎每行代码都有注释,相信你们一定能看懂,最好自己在Android Studio上手敲一遍,这样印象才会更加深刻
MainActivity的布局文件activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:orientation="vertical"
android:gravity="center">
<ImageView
android:src="@drawable/choujiang2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/btn"
android:layout_width="245dp"
android:layout_height="wrap_content"
android:text="抽奖"
android:layout_marginTop="10dp"/>
</LinearLayout>
DetailActivity代码如下
package com.example.notification;
import android.app.NotificationManager;
import android.os.Bundle;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
public class DetailActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_detail);
NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
manager.cancel(123); //这里的cancle传入的是一个123,就是我们创建Notification中指定的通知的ID
}
}
注意:写完DetailActivity不要忘了在AndroidManifest.xml还要进行注册,在<application>中加上这行代码
<activity android:name=".DetailActivity"/>
DetailActivity布局文件activity_detail.xml
<?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"
android:gravity="center">
<TextView
android:text="开个玩笑,你还当真"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
我的总结
刚开始学时,我使用 Notification.Builder 来创建 Notification 对象,遇到了这个错误
Could not connect to the 'pipe:qemud:wififorward' service: Invalid argument,在网上查了一下,说是因为Android版本不同引起的,需要在AndroidManifest.xml里加上下面一行代码
android:usesCleartextTraffic="true"
这行代码的意思是降低安全级别,但是我加上这行代码后,依然是报同样的错误,于是我查询了许久看了大佬写的一篇文章后终于找到了原因及解决方法,那就是使用 NotificationCompat.Builder 来创建 Notification 对象,可以避免很多兼容性问题。
文章地址链接:Android Notification(通知)(含兼容问题) - 简书 (jianshu.com)
还有Android 开发者网站:创建通知 | Android 开发者 | Android Developers (google.cn)
最后再次重申一遍,最好手动敲一遍,不要怕遇到问题,当你遇到问题再把它解决后这表明你离小白又远了一步。