赞
踩
如何发送一个通知?
Android 8版本之前:
第一步:获取NotificationManager
mNotificationManager = (NotificationManager)activity.getSystemService(NOTIFICATION_SERVICE);
第二步:构建一个Notification的builder用于构建Notification
- Notification.Builder builder=new Notification.Builder(activity);
- builder.setContentTitle("测试 "+mNotificationId) //必须提供
- .setContentText("测试内容") //必须提供
- .setTicker("测试通知到达")
- .setWhen(System.currentTimeMillis())
- .setPriority(Notification.PRIORITY_DEFAULT)//设置该通知优先级
- .setSmallIcon(R.mipmap.ic_launcher_round) //必须提供
- .setOngoing(true) // 设置常驻用户无法清除
- .setContentIntent(intent); //用于点击通知跳转界面
第三步:调用NotificationManager的notify函数,传入一个int类型id(用于标识通知)和一个Notification对象
mNotificationManager.notify(mNotificationId++, builder.build());
Android 8版本之后:
大体步骤没什么区别,多了个Channel通道
- mNotificationManager = (NotificationManager) activity.getSystemService(NOTIFICATION_SERVICE);
- NotificationChannel channel = new NotificationChannel(CHANNEL_ID,"my_channel",NotificationManager.IMPORTANCE_DEFAULT);
- channel.enableLights(true); //是否在桌面icon右上角展示小红点
- channel.setLightColor(Color.GREEN); //小红点颜色
- channel.setShowBadge(true); //是否在久按桌面图标时显示此渠道的通知
- mNotificationManager.createNotificationChannel(channel);//创建Channel
builder需要设置Channel
- builder.setContentTitle("测试 "+mNotificationId) //必须提供
- .setContentText("测试内容") //必须提供
- .setTicker("测试通知到达")
- .setWhen(System.currentTimeMillis())
- .setPriority(Notification.PRIORITY_DEFAULT)//设置该通知优先级
- .setSmallIcon(R.mipmap.ic_launcher_round) //必须提供
- .setOngoing(true) // 设置常驻用户无法清除
- .setContentIntent(intent) //用于点击通知跳转界面
- .setChannelId(CHANNEL_ID); //Android O以上版本必须提供
同样是调用notify开启一个通知
mNotificationManager.notify(mNotificationId++, builder.build());
添加点击通知跳转Activity:
创建一个Intent
- mIntent=new Intent();
- mIntent.setClass(activity,SecondActivity.class);
创建一个PendingIntent:
PendingIntent intent=PendingIntent.getActivity(activity,0,mIntent,0);
在builder中setContentIntent
- builder.setContentTitle("测试 "+mNotificationId) //必须提供
- .setContentText("测试内容") //必须提供
- .setTicker("测试通知到达")
- .setWhen(System.currentTimeMillis())
- .setPriority(Notification.PRIORITY_DEFAULT)//设置该通知优先级
- .setSmallIcon(R.mipmap.ic_launcher_round) //必须提供
- .setOngoing(true) // 设置常驻用户无法清除
- .setContentIntent(intent) //用于点击通知跳转界面
- .setChannelId(CHANNEL_ID); //Android O以上版本必须提供
清除一个消息:传给NotificationManager一个启动时的ID即可删除
mNotificationManager.cancel(mNotificationId-1);
清除所有消息:
mNotificationManager.cancelAll();
演示效果:
扩展:自定义Notification的View视图实现QQ音乐播放功能
第一步:准备我们的布局文件,这个布局文件有特殊要求:
仅支持FrameLayout、LinearLayout、RelativeLayout三种布局控件
AnalogClock、Chronometer、Button、ImageButton、ImageView、ProgressBar、TextView、ViewFlipper、ListView、GridView、StackView和AdapterViewFlipper这些显示控件
使用其他View会引起ClassNotFoundException异常。
仿QQ音乐Notification布局如下
- <?xml version="1.0" encoding="utf-8"?>
- <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:app="http://schemas.android.com/apk/res-auto"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
-
- >
- <ImageView
- android:id="@+id/title_icon"
- android:layout_width="100dp"
- android:layout_height="100dp"
- android:layout_marginLeft="16dp"
- android:layout_marginTop="8dp"
- android:layout_marginBottom="8dp"
- android:src="@drawable/title_icon"
- android:layout_marginStart="16dp" />
- <RelativeLayout
- android:layout_width="match_parent"
- android:layout_height="100dp"
- android:layout_toRightOf="@+id/title_icon"
- android:layout_marginRight="16dp"
- android:layout_marginTop="8dp"
- android:layout_marginBottom="8dp"
- android:layout_marginEnd="16dp"
- android:layout_toEndOf="@+id/title_icon">
- <TextView
- android:id="@+id/song_title"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="七里香"
- android:textSize="20sp"
- android:textStyle="bold"
- android:layout_marginLeft="16dp"
- android:layout_marginTop="16dp"
- android:layout_marginStart="16dp" />
- <TextView
- android:id="@+id/singer"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="周杰伦"
- android:layout_marginLeft="16dp"
- android:layout_marginTop="4dp"
- android:layout_below="@+id/song_title"
- android:layout_marginStart="16dp" />
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:layout_below="@id/singer"
- android:weightSum="5"
- android:orientation="horizontal"
- >
- <Button
- android:id="@+id/love"
- android:layout_width="0dp"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:text="@string/song_like"
- android:textColor="@android:color/holo_red_light"
- android:background="@android:color/transparent"
- />
- <Button
- android:id="@+id/song_back"
- android:layout_width="0dp"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:text="@string/song_back"
- android:textSize="16sp"
- android:textColor="@android:color/black"
- android:background="@android:color/transparent"
- />
- <Button
- android:id="@+id/song_start"
- android:layout_width="0dp"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:text="||"
- android:textColor="@android:color/black"
- android:background="@android:color/transparent"
- />
- <Button
- android:id="@+id/song_front"
- android:layout_width="0dp"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:text=">"
- android:textSize="16sp"
- android:textColor="@android:color/black"
- android:background="@android:color/transparent"
- />
- <Button
- android:id="@+id/song_font"
- android:layout_width="0dp"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:text="词"
- android:textColor="@android:color/darker_gray"
- android:background="@android:color/transparent"
- />
- </LinearLayout>
- <TextView
- android:id="@+id/btn_item_close"
- android:layout_width="20dp"
- android:layout_height="20dp"
- android:layout_alignParentEnd="true"
- android:layout_alignParentTop="true"
- android:layout_alignParentRight="true"
- android:gravity="center"
- android:text="X"
- android:textStyle="bold"
- />
-
- </RelativeLayout>
-
- </RelativeLayout>
效果如下:
第二步:
添加通知View,添加点击事件,添加一个Notification
- Notification.Builder builder=new Notification.Builder(activity);
- Intent in=new Intent("close");
- in.setPackage(activity.getPackageName());
- PendingIntent intent=PendingIntent.getBroadcast(activity,0
- ,in,PendingIntent.FLAG_UPDATE_CURRENT);
-
- MyNotificationView myNotificationView=new MyNotificationView(activity.getPackageName()
- ,R.layout.notification_item
- ,activity);
- myNotificationView.setOnClickPendingIntent(R.id.btn_item_close,intent);
-
- builder.setSmallIcon(R.mipmap.ic_launcher)
- .setOngoing(false)
- .setAutoCancel(true)
- .setCustomContentView(myNotificationView)
- .setChannelId(CHANNEL_ID)
- .setWhen(SystemClock.currentThreadTimeMillis())
- .setContentIntent(intent);
- mNotificationManager.notify(mNotificationId++, builder.build());
第三步,写一个广播接受者,接受发出的广播事件
- public class MusicReceiver extends BroadcastReceiver {
-
- @Override
- public void onReceive(Context context, Intent intent) {
- String action=intent.getAction();
- if (action != null && action.equals("close")) {
- if(MainActivity.myHandler!=null){
- MainActivity.myHandler.sendEmptyMessage(MainActivity.MESSAGE_CLOSE);
- }
- }
- }
- }
项目效果:
点击Toast
项目git地址:https://github.com/1104219446/NitificationTest.git
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。