通知
- 当某个应用程序希望向用户发出提示信息,但是这个应用又不在前台运行的时候,就需要使用通知
- 通知发出之后,手机最上方的状态栏中会显示一个图标,下拉状态栏可以看到详细内容
基本用法
通知可以在活动中创建(比较少见),也可以在广播接收器创建,也可以在服务里创建
-
例子
import androidx.appcompat.app.AppCompatActivity; import androidx.core.app.NotificationCompat; import android.app.Notification; import android.app.NotificationChannel; import android.app.NotificationManager; import android.app.PendingIntent; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Build; import android.os.Bundle; import android.view.View; import android.widget.Button; public class MainActivity extends AppCompatActivity implements View.OnClickListener { NotificationManager manager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button sendNotice = (Button) findViewById(R.id.send_notice); sendNotice.setOnClickListener(this); manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); } @Override public void onClick(View v){ switch (v.getId()){ case R.id.send_notice: // 高版本需要给通知注册渠道,不然不能发出通知(高版本是Android8.0以上) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){ NotificationChannel notificationChannel = new NotificationChannel("noticeID","channelname",NotificationManager.IMPORTANCE_HIGH); manager.createNotificationChannel(notificationChannel); } Intent intent = new Intent(this,NotificationActivity.class); // 加上PendingIntent之后,点击通知就会弹出到另一个layout中 PendingIntent pendingIntent = PendingIntent.getActivity(this,0,intent,0); Notification notification = new NotificationCompat.Builder(this,"noticeID") .setContentTitle("通知标题") .setContentText("通知内容") .setWhen(System.currentTimeMillis()) .setSmallIcon(R.mipmap.ic_launcher) .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher)) .setContentIntent(pendingIntent) .setAutoCancel(true) // 自动取消通知,点击通知之后通知就消失了 .build(); manager.notify(1,notification); break; default: break; } } }
- 使用NotificationManager来管理通知,
- getSystemService()方法接收一个字符串参数,这个参数用来确认获取系统的哪个服务(NOTIFICATION_SERVICE)
- setWhen():指定通知被创建的时间,这里以毫秒为单位,下拉系统状态栏时,指定的时间会显示在相应的通知上
- setSmallIcon():设置通知小图标,用来显示在系统状态栏上
- setLargeIcon():设置通知大图标,用在下拉系统状态栏时
- 最后调用notify()方法显示通知
- PendingIntent:类似于Intent,但是相比较Intent,它更倾向于在某个时刻执行某个动作,相当于延迟执行的Intent
- PendingIntent提供了好几个静态方法来获取它的实例,包括getActivity(),getBroadcast(),getService(),它们接收的参数都一样
- 参数1:Context,连接上下文
- 参数2:对PendingIntent的描述,请求值不同,Intent 就不同,一般传入0
- 参数3:Intent对象,包含要跳转的目标
- 参数4:确定PendingIntent的行为,有4种常量,如果不想指定,可以传入数字0
- FLAG_ONE_SHOT:相同的PendingIntent只能使用一次,遇到相同的PendingIntent时不会去更新其中封装的Intent的extra部分
- FLAG_NO_CREATE:如果当前系统不存在相同的PendingIntent对象,系统不会创建该PendingInt对象,而是直接返回null
- FLAG_CANCEL_CURRENT:如果当前系统中有一个相同的PendingIntent对象,需要将它先取消,然后再生成一个PendingIntent对象
- FLAG_UPDATE_CURRENT:如果系统中存在一个PendingIntent,且和用户的PendingIntent一样,那么系统就会使用这个已经存在的PendingIntent对象,但是会使用新的Intent来更新之前PendingIntent中的Intent对象数据
-
通知渠道
Android 8.0(Android O)引入了通知渠道,用来对通知信息进行区分
每一条通知都有一个对应的渠道,用户可以自由选择这些通知渠道的重要度,从而自由选择是否关闭某些通知
创建通知渠道之后,程序不能修改通知的行为,只有用户可以修改,通知只能修改渠道名称和描述
在Android 8.0 及之后的版本,如果不给通知注册通知渠道,是不会发出通知的
-
使用NotificationChannel类构建通知渠道,使用createNotificationChannel()方法创建通知渠道
manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){ channel = NotificationChannel(channelID,channelName,importance); manager.createNotificationChannel(channel) }
NotificationChannel()接收三个参数
channelId:渠道ID,自定义,需要保证全局唯一性
channelName:渠道名称,自定义,用来展示给用户看的
importance:渠道重要等级,会影响到这个渠道中所有通知的显示,必须指定
-
渠道等级分类
重要等级 代码 紧急(发出声音,并显示为提醒通知) IMPORTANCE_HIGH 高(发出声音) IMPORTANCE_DEFAULT 中等(没有声音) IMPORTANCE_LOW 低(没有声音,且不会出现在状态栏) IMPORTANCE_MIN
其他用法
-
NotificationCompat.Builder中的API
-
直接使用通知的默认效果,根据当前手机的环境来决定播放什么铃声,如何振动
Notification notification = new NotificationCompat.Builder(this,"mychannelID") .setDefaults(NotificationCompat.DEFAULT_CALL) .build();
-
setSound(Uri uri)方法
在通知发出的时候播放音频
接收一个uri参数,在指定音频文件的时候需要先获取到音频文件对应的URI
-
例子
Notification notification = new NotificationCompat.Builder(this,"mychannelID") .setSound(Uri.fromFile(new File("/system/media/audio/ringtones/abc.ogg"))) .build();
-
setVibrate()方法
在有通知的时候让手机进行振动
-
接收一个长整型数组,用来设置手机静止和振动的时长,单位是毫秒
- 数组中总共四个元素,分别是延迟x毫秒,振动x毫秒,再延迟x毫秒,再振动x毫秒
-
例子
-
先在AndroidManifest.xml中添加权限
<uses-permission android:name="android.permission.VIBRATE"/>
-
实现setVibrate()
Notification notification = new NotificationCompat.Builder(this,"mychannelID") // 此处表示延迟0ms,振动1000ms,延迟2000ms,振动3000ms .setVibrate(new long[] {0,1000,2000,3000}) .build();
-
-
setLights()方法
用来控制前置的LED灯
-
接收三个参数
- 参数1:指定LED灯的颜色
- 参数2:指定LED灯亮起的时长,单位是毫秒
- 参数3:指定LED灯暗的时长,单位是毫秒
参数2和参数3结合就实现了一闪一闪的效果
-
例子
Notification notification = new NotificationCompat.Builder(this,"mychannelID") .setLights(Color.GREEN,1000,1000) .build();
-
setStyle()方法
允许用户构建富文本通知内容(通知中可以包含长文字,图片之类的)
-
例子
-
显示长文字
Notification notification = new NotificationCompat.Builder(this,"mychannelID") .setStyle(new NotificationCompat.BigTextStyle().bigText("这是一段长文字,真的是一段长文字,不信你再读一读看看是不是长文字")) .build();
-
显示图片
Notification notification = new NotificationCompat.Builder(this,"mychannelID") .setStyle(new NotificationCompat.BigPictureStyle().bigPicture(BitmapFactory.decodeResource(getResources(),R.drawable.big_image))) .build();
-
-
setPriority()方法
- 用来设置通知的重要程度
- 接收一个整型参数
- PRIORITY_DEFAULT:默认的重要程度,和不设置的效果一样
- PRIORITY_MIN:最低的重要程度,在特定的场景才会显示这条通知
- PRIORITY_LOW:较低的重要程度,系统会缩小这类通知,或者改变显示顺序,尽量往后放
- PRIORITY_HIGH:较高的重要程度,系统会放大这类通知,显示的时候往前放
- PRIORITY_MAX:最高的重要程度,让用户立即看到,立即做出响应
-