写给初学者28_android_Notification

来源:互联网 发布:整治网络传销可丽金 编辑:程序博客网 时间:2024/06/05 20:49

安卓28_通知栏技术


这个就是你经常去划掉的那个小方框,好的通知栏,符合规矩的通知栏是让人很舒服的,除了那些流氓一点的。想要开发出通知栏,也是十分简单的。基本掌握两个类

  • NotificationManager 管理 负责发送,关闭等
  • Notification 被发送的通知栏对象

从这两个类你基本能知晓,使用Manager来管理Notification,安卓这种Manager遍地都是,比如在这之前的LocalBroadcastManager,LayoutManager等。

基本使用

public class MainActivity extends AppCompatActivity {    NotificationManager manager;    Notification notification;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);    }    private void sendNotification() {        // 产生Notification对象        notification = new  NotificationCompat.Builder(this)            .setContentTitle("你有一条新消息")            .setContentText("I am a Notification")            .setWhen(System.currentTimeMillis())            .setSmallIcon(R.mipmap.ic_launcher)            .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher)).                    build();        // 唤醒一个通知,第一个参数是notification的id         manager.notify(1,notification);    }    public void onClick(View view){    sendNotification();    }}

我在这里有一个按钮,使用onClick属性进行监听事件的确定。这里初学者是比较难理解这种写法的,如果你已经对弹出对话框的写法有一定了解,那么你就不会那么难理解了,JAVA底子好的人一眼就能看出这是一种构建型设计模式的体现。

效果

关于这些参数对应着结果,一目了然。

通知栏响应点击

这里我们只是发了一条基本消息,并且这条消息点击过后是没有任何效果的,一般的处理操作,当点击以后会直接启动用户界面交互,或者其他操作。

如果我们要通过点击打开一个Activity,或者Service,又或则发送一条广播,那么我们应该只管想象到Intent,因为这些的启动需要Intent。不过这里除了Intent,还需要新的一个类PendingIntent。简单理解就是一种等待执行的Intent,当用户触发才会执行的。

关于PendingIntent的实例获取,根据你要启动的是活动还是服务还是广播来决定。也就是

  • getActivity
  • getService
  • getBroadcast

然后需要传入参数

  1. context 上下文
  2. requestCode 请求码(一般不用 传入0)
  3. Intent 意图
  4. flags PendingIntent的行为方式

关于 flag 有四个标示

  • FLAG_ONE_SHOT 只能使用一次
  • FLAG_NO_CREATE
  • FLAG_CANCEL_CURRENT如果描述的PendingIntent已经存在,则在产生新的Intent之前会先取消掉当前的
  • FLAG_UPDATE_CURRENT最经常使用的是FLAG_UPDATE_CURRENT,描述的Intent有 更新的时候需要用到这个flag去更新你的描述

根据实际情况选择就好了。

实现点击通知栏进行跳转。

在这里我们只需要对我们的Notification对象添加一条ContentIntent就好,而这个要求的参数就PendingIntent引用。

这次先看结果

code:

public class MainActivity extends AppCompatActivity {NotificationManager manager;Notification notification;PendingIntent pendingIntent;Intent intent;@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);    intent = new Intent(this, NextActivity.class);    pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);}private void sendNotification() {    notification = new NotificationCompat.Builder(this)            .setContentTitle("你有一条新消息")            .setContentText("I am a Notification")            .setWhen(System.currentTimeMillis())            .setSmallIcon(R.mipmap.ic_launcher)            .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher))            .setContentIntent(pendingIntent).                    build();    manager.notify(1, notification);}public void onClick(View view) {    sendNotification();}}

不过我们的消息并没有因为点击而消失,这个时候只需要简单的多调用一个方法,setAutoCancel(true)那么点击以后Notification就会自己消失了。

特别注意,这里需要和Activity的启动模式结合使用才是最佳,不然你的Notification点击一次返回栈里面就会有一个全新的Activity,结合实际情况选择合适的启动模式就好了。

通知的声音、振动

一般我们的通知都会带有声音或者振动,从而来达到提醒的作用。

  • setSound 要求传递的是资源人间的URI
  • setVubrate 传递是振动时间
  • setLights 要求传递颜色和灯亮起和暗下时常

时间都是以毫秒作为单位

code

振动权限

/*<uses-permission android:name="android.permission.VIBRATE"/>*/private void sendNotification() {    notification = new NotificationCompat.Builder(this)            .setContentTitle("你有一条新消息")            .setContentText("I am a Notification")            .setWhen(System.currentTimeMillis())            .setSmallIcon(R.mipmap.ic_launcher)            .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher))            .setContentIntent(pendingIntent)            // 这里是系统中铃声中的一个 如果是自己的文件 注意路径就好了            .setSound(Uri.fromFile(new File("/system/media/audio/ringtones/Nib.ogg")))            // 首先振动需要权限 第一个位置代表静止时长 第二个代表振动时长 可以重复多次组合            .setVibrate(new long[]{0,2000})            // 点击后消失            .setAutoCancel(true)            .build();    manager.notify(1, notification);}

让消息栏出现在手机屏幕上方

只需要将权限设置为最大

.setPriority(NotificationCompat.PRIORITY_MAX)

让消息栏实现更多的内容

  • 显示更多的文字
  • 显示更大的图片

都是通过setStyle来完成

//.setStyle(new NotificationCompat.BigTextStyle().bigText("放入长消息")).setStyle(new NotificationCompat.BigPictureStyle().bigPicture(BitmapFactory.decodeResource(getResources(),R.drawable.timg)))

Notification的使用完全调用系统当中的方法就能满足一本的基本要求,当然我们也可以自定义消息栏,比如最常见的音乐播放器的消息栏、关于这一个技术,比四大组件都简单,没有必要死记硬背,什么时候要用,多多查阅就好

0 0