if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationChannel channel = new NotificationChannel(Chanel_ID, name, NotificationManager.IMPORTANCE_HIGH);
// 可打可不打,随便
channel.setDescription(description);
channel.enableLights(false); //是否在桌面icon右上角展示小红点
channel.setLightColor(Color.GREEN); //小红点颜色
channel.setShowBadge(true); //是否在久按桌面图标时显示此渠道的通知
NotificationManager notificationManager = getSystemService(NotificationManager.class);
notificationManager.createNotificationChannel(channel);
Log.e(TAG, "" );
}
dependencies {
implementation "com.android.support:support-compat:28.0.0"
}
通知的设计由系统模板决定,您的应用只需定义模板各部分的内容。通知的某些详细信息仅在展开视图中显示。
private void tongzhi() {
//通知栏的显示
NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); //获取这个服务
Notification notification = new NotificationCompat.Builder(getApplicationContext())
.setContentTitle("我是标题") //设置标题
.setContentText("我是内容") //设置内容
.setWhen(System.currentTimeMillis()) //设时间,获取当前时间
.setSmallIcon(R.drawable.p2) //设置小图标
.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.p1)) //设置大图标
.build();
manager.notify(1, notification);
}
private void init() {
button = findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
tongzhi();
}
});
}
.setAutoCancel(true) //设置为自动取消
NotificationManager manager =
(NotificationManager)getSystemService(NOTIFICATION_SERVICE);
manager.cancel(1);
这里的cancle传入的是一个1,就是我们创建Notification中指定的通知的ID
1)、设置声音
(2)、设置振动
(3)、设置LED灯闪烁
(4)、进行默认效果设置
Notification notification = new NotificationCompat.Builder(MainActivity.this)
...
.setSound(Uri.fromFile(new File("/system/media/audio/ringtones/Luna.ogg")))
//设置通知提示音
.setVibrate(new long[]{0,1000,1000,1000})
//设置振动, 需要添加权限
.setLights(Color.GREEN,1000,1000)
//设置前置LED灯进行闪烁, 第一个为颜色值 第二个为亮的时长 第三个为暗的时长
.setDefaults(NotificationCompat.DEFAULT_ALL)
//使用默认效果, 会根据手机当前环境播放铃声, 是否振动
.build();
manager.notify(1,notification);
通知可以包含动画形式的进度指示器,向用户显示正在进行的操作状态。
如果您可以估算操作在任何时间点的完成进度,应通过调用 setProgress(max, progress, false)
使用指示器的“确定性”形式。第一个参数是“完成”值(如 100);第二个参数是当前完成的进度,最后一个参数表明这是一个确定性进度条。
随着操作的继续,持续使用 progress
的更新值来调用 setProgress(max, progress, false)
并重新发出通知。
操作结束时,progress
应等于 max
。您可以在操作完成后仍保留显示进度条,也可以将其移除。无论哪种情况,都请记得更新通知文本以显示操作已完成。要移除进度条,请调用 setProgress(0, 0, false)
。
注意:由于进度条要求应用持续更新通知,因此该代码通常应在后台服务中运行。
要显示不确定性进度条(不指示完成百分比的进度条),请调用 setProgress(0, 0, true)
。结果会产生一个与上述进度条样式相同的指示器,区别是这个进度条是一个持续动画,不指示完成情况。在您调用 setProgress(0, 0, false)
之前,进度动画会一直运行,调用后系统会更新通知以移除 Activity 指示器。
同时,请记得更改通知文本,以表明操作已完成。
此处为小deemo,复制粘贴后实现以上效果
public class b extends AppCompatActivity {
int PROGRESS_MAX = 100;
int PROGRESS_CURRENT = 0;
String Chanel_ID = "这是Channel_ID";
int notificationId = 1;
String name = "这是姓名";
String description = "这是描述";
String TAG = "---------";
NotificationCompat.Builder builder;
NotificationManagerCompat notificationManager;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.b);
init();
}
private void init() {
Button button = findViewById(R.id.button3);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationChannel channel = new NotificationChannel(Chanel_ID, name, NotificationManager.IMPORTANCE_DEFAULT);
channel.setDescription(description);
NotificationManager notificationManager = getSystemService(NotificationManager.class);
notificationManager.createNotificationChannel(channel);
}
notificationManager = NotificationManagerCompat.from(getApplicationContext());
builder = new NotificationCompat.Builder(getApplicationContext(), Chanel_ID);
builder.setContentText("Download in progress")
.setContentTitle(" Picture Download")
.setSmallIcon(R.drawable.p1s)
.setAutoCancel(true)
.setPriority(NotificationCompat.PRIORITY_HIGH);
builder.setProgress(PROGRESS_MAX, PROGRESS_CURRENT, false);
notificationManager.notify(notificationId, builder.build());
new Thread(new Runnable() {
@Override
public void run() {
// 这几个都要设置为全局变量,否则新建的多线程没法接收到
// NotificationCompat.Builder builder;
// NotificationManagerCompat notificationManager;
//int PROGRESS_MAX = 100;
//int PROGRESS_CURRENT = 0;
for (int i = PROGRESS_CURRENT; i < PROGRESS_MAX; i++) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
Log.e(TAG, "i的值" + i);
//每次运行都进行+1
PROGRESS_CURRENT = ++PROGRESS_CURRENT;
builder.setProgress(PROGRESS_MAX, PROGRESS_CURRENT, false);
notificationManager.notify(notificationId, builder.build());
Log.e(TAG, "run: " + PROGRESS_CURRENT);
//当他大于100时,下载完成并且删除此通知栏的下载按钮
if (PROGRESS_CURRENT == 100) {
//下载完成后出现这个
builder.setContentText("Download complete")
.setProgress(0, 0, false);
notificationManager.notify(notificationId, builder.build());
}
}
}
}).start();
}
});
}
}
Bitmap bitmap1 = BitmapFactory.decodeResource(this.getResources(), R.drawable.p1s);
builder = new NotificationCompat.Builder(getApplicationContext(), Chanel_ID);
builder.setContentText("Download in progress")
.setContentTitle(" Picture Download")
.setFullScreenIntent(pendingIntent,true)
.setSmallIcon(R.drawable.p1s)
.setStyle(new NotificationCompat.BigPictureStyle().bigPicture(bitmap1))
效果图如下
通知的是否可见
.setStyle(new NotificationCompat.BigTextStyle().bigText("DSAFFFFFFFFFFFFFFFF"))
//显示应用是否在锁屏可见
/*
VISIBILITY_PUBLIC 显示通知的完整内容。
VISIBILITY_SECRET 不在锁定屏幕上显示该通知的任何部分。
VISIBILITY_PRIVATE 显示基本信息,例如通知图标和内容标题,但隐藏通知的完整内容,比如Big。Text
*/
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
.setAutoCancel(true)
/**
* 如果用户设备被锁定,会显示全屏 Activity,覆盖锁屏。
* 如果用户设备处于解锁状态,通知以展开形式显示,其中包含用于处理或关闭通知的选项
*/
.setPriority(NotificationCompat.PRIORITY_HIGH);
此处为一个小deemo 可以复制粘贴后进行实践理解 点击后进行跳转和取消通知
private void tongzhi() {
/**
* 使用PendingIntent进行通知点击跳转功能。
* PendingIntent的用法:
* (1)、通过getActivity()、getBroadcast()、getService()方法获取实例
* (2)、参数(Context context, int requestCode, Intent intent, int flags)
* 第一个参数:Context
* 第二个参数:requestCode 一般用不到 ,通常设置为0
* 第三个参数:intent
* 第四个参数:flags 用于确定PendingIntent的行为。这里传0就行
*/
//跳转
Intent intent=new Intent(MainActivity.this,a.class);
PendingIntent pi=PendingIntent.getActivity(this,0,intent,0);
/**
* 需要使用一个Builder构造器来创建Notification对象,由于API不同会造成不同版本的通知出现不稳定的问题,
* 所以这里使用NotificationCompat类来兼容各个版本
*/
//通知栏的显示
NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); //获取这个服务
Notification notification = new NotificationCompat.Builder(getApplicationContext())
.setContentTitle("我是标题") //设置标题
.setContentText("我是内容") //设置内容
.setWhen(System.currentTimeMillis()) //设时间,获取当前时间
.setSmallIcon(R.drawable.p2) //设置小图标
.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.p1)) //设置大图标
.setContentIntent(pi) ///跳转
.setAutoCancel(true) //自动取消通知栏
.build();
manager.notify(1, notification);
}
private void init() {
button = findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
tongzhi();
}
});
}
附赠小deemo,进行实践理解他们的堆栈问题
public class MainActivity extends AppCompatActivity {
// String Chanel_ID = "这是Channel_ID";
// String name = "这是姓名";
// String description = "这是描述";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
panduan();
tiaozhuan();
}
private void panduan() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
//ID Name Desription 都要在全局变量中设定
NotificationChannel channel = new NotificationChannel("ID", "name", NotificationManager.IMPORTANCE_DEFAULT);
channel.setDescription("描述");
NotificationManager notificationManager = getSystemService(NotificationManager.class);
notificationManager.createNotificationChannel(channel);
}
}
private void tiaozhuan() {
//这个设置的最低安卓版本是 16
//这是需要堆栈,就是并不是返回桌面而是层级返回,他会新建一个栈,和原来的应用不是一起的堆栈
//这个需要在AndroidManifest。xml里进行设置class的父类,让新建的栈能根据父类设定层层返回
Intent intent = new Intent(getApplicationContext(), san.class);
TaskStackBuilder stackBuilder = TaskStackBuilder.create(getApplicationContext());
stackBuilder.addNextIntentWithParentStack(intent);
PendingIntent pendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
//这个是,只要退出就返回桌面
// Intent intent = new Intent(this, c.class);
// intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
// PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
NotificationManagerCompat notificationManager = NotificationManagerCompat.from(getApplicationContext());
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, "ID")//这个要和上个是一致的,这就是为甚全局变量
.setSmallIcon(R.drawable.ic_launcher_background)
.setContentText("标题")
.setAutoCancel(true)
.setContentTitle("内容")
.setContentIntent(pendingIntent);
//这个notification——id 也要设置全局变量
notificationManager.notify(1, builder.build());
}
}