美文网首页
Android Notification用法全解析

Android Notification用法全解析

作者: 付凯强 | 来源:发表于2017-09-26 17:10 被阅读0次

    关于通知

    当某个应用程序希望向用户发出一些提示信息,而该应用程序又不在前台运行时,就可以借助通知来实现。发出一个通知后,手机最上方的状态栏中会显示一个通知的图标,下拉状态栏后可以看到通知的详细内容。

    A. 通知使用场景

    通知可以在活动、广播接收器和服务里创建。相比于广播接收器和服务,在活动里创建通知的场景还是比较少的,因为一般只有当程序进入到后台的时候我们才需要使用通知。

    B. 创建通知的详细步骤

    1.获取NotificationManager的实例:

    NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
    
    通过getSystemService()方法获取到NotificationManager;
    
    方法接收一个字符串参数用于确定获取系统的哪个服务,这里传入NOTIFICATION_SERVICE就表示获取的是通知管理器。
    

    2.使用support-v4包中的NotificationCompat类的Builder构造器来创建Notification对象。

    Notification notification = new NotificationCompat.Builder(this)
                            .setContentTitle("This is content title")
                            .setContentText("This is context text")
                            .setWhen(System.currentTimeMillis())
                            .setSmallIcon(R.mipmap.ic_launcher)
                            .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher))
                            .build();
                            
    1.setContentTitle   用于指定通知的标题内容。
    2.setContentText    用于指定通知的正文内容,下拉系统状态栏就可以看到。
    3.setWhen   用于指定通知被创建的时间,以毫秒为单位,下拉系统状态栏就会看到。
    4.setSmallIcon  用于设置通知的小图标,注意只能使用纯alpha图层的图片进行设置,小图标会显示在系统状态栏上。
    5.setLargeIcon  用于设置通知的大图标,下拉系统状态栏即可见。
                            
    

    3.调用NotificationManager的notify方法让通知显示出来。

    manager.notify(1, notification);
    
    notify方法接收两个参数:第一个参数是id,保证为每个通知所指定的id都是不同的。第二个参数是Notification对象,这里直接换入刚刚创建好的Notification对象。
    

    4.栗子:

    • 新建项目,修改activity_main.xml中的代码:
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/activity_main"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context="com.fkq.inform.MainActivity">
    
        <Button
            android:id="@+id/send_notice"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Send Notice" />
    </LinearLayout>
    
    布局很简单,添加一个Button按钮,用于发送通知。
    
    • 修改MainActivity中的代码:
    public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            Button button = (Button) findViewById(R.id.send_notice);
            button.setOnClickListener(this);
        }
    
        @Override
        public void onClick(View view) {
            switch (view.getId()) {
                case R.id.send_notice:
                    NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
                    Notification notification = new NotificationCompat.Builder(this)
                            .setContentTitle("This is content title")
                            .setContentText("This is context text")
                            .setWhen(System.currentTimeMillis())
                            .setSmallIcon(R.mipmap.ic_launcher)
                            .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher))
                            .build();
                    manager.notify(1, notification);
                    break;
            }
        }
    }
    

    C. 实现通知的点击效果-PendingIntent

    1.PendingIntent和Intent相同点和不同点:

    相同点:都可以去指明某一个“意图”,都可以用于启动活动、启动服务以及发送广播等。

    不同点:Intent更倾向于立即执行某个动作,而PendingIntent更加倾向于在某个合适的时机去执行某个动作。

    总之:PendingIntent简单的理解为延迟执行的Intent。

    2.PendingIntent用法:

    • PendingIntent提供了几个静态方法用于获取PendingIntent的实例,我们可以根据需求来选择是使用getActivity方法、getBroadcast方法、还是getService方法。

    • 这三个方法所接收的参数是相同的,第一个参数是Context,第二个参数一般用不到,传入0即可,第三个参数是Intent对象,我们可以通过这个对象构建出PendingIntent的“意图”,第四个参数用于确定PendingIntent的行为,有Flag_ONE_SHOT、FLAG_NO_CREATE、FLAG_CANCEL_CURRENT和FLAG_UPDATE_CURRENT这4种值可选,通常传入0即可。

    • NotificationCompat.Builder构造器还可以再连缀一个setContentIntent方法,接收的参数正是一个PendingIntent对象。因此,这里就可以通过PendingIntent构建出一个延迟执行的“意图”,当用户点击这条通知时就会执行相应的逻辑。

    3.添加点击功能:

    • 创建NotificationActivity和notification_layout:
    public class NotificationActivity extends AppCompatActivity {
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.notification_layout);
        }
    }
    
    <activity android:name=".NotificationActivity"></activity>
    
    • 修改MainActivity:
    Intent intent = new Intent(this, NotificationActivity.class);
    PendingIntent pi = PendingIntent.getActivity(this, 0, intent, 0);
    NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
    Notification notification = new NotificationCompat.Builder(this)
            .setContentTitle("This is content title")
            .setContentText("This is context text")
            .setWhen(System.currentTimeMillis())
            .setSmallIcon(R.mipmap.ic_launcher)
            .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher))
            .setContentIntent(pi)
            .build();
    manager.notify(1, notification);
    
    1.使用Intent表达出我们想要启动NotificationActivity的“意图”。
    2.然后将构建好的Intent对象传入到PendingIntent的getActivity里面,以得到PendingIntent的实例。
    3.接着在NotificationCompat.Builder中调用setContentIntent方法,把它作为参数传入即可。
    

    D. 点击通知后取消在系统的状态栏上的通知

    1.在NotificationCompat.Builder中连缀一个setAutoCancel方法,传入true即可。

    Notification notification = new NotificationCompat.Builder(this)
            .setContentTitle("This is content title")
            .setContentText("This is context text")
            .setWhen(System.currentTimeMillis())
            .setSmallIcon(R.mipmap.ic_launcher)
            .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher))
            .setContentIntent(pi)
            .setAutoCancel(true)
            .build();
    

    2.显式地调用Notification的cancel方法将它取消:

    public class NotificationActivity extends AppCompatActivity {
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.notification_layout);
            NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
            manager.cancel(1);
        }
    }
    
    如果想取消哪条通知,在cancel方法中传入该通知的id就行了
    
    

    E. 通知的进阶技巧

    1.通知到达有声音:
    2.通知到达震动:

    Notification notification = new NotificationCompat.Builder(this)
            .setContentTitle("This is content title")
            .setContentText("This is context text")
            .setWhen(System.currentTimeMillis())
            .setSmallIcon(R.mipmap.ic_launcher)
            .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher))
            .setContentIntent(pi)
            .setSound(Uri.fromFile(new File("/system/media/audio/ringtones/Little_Beat.ogg")))
            .setVibrate(new long[]{0,1000,0,0})
            .build();        
                 
    1.setSound方法接收一个Uri参数,比如每个手机的/system/media/audio/ringtones目录下都有很多的音频文件,以上是vivo x9i手机的。
    2.setVibrate方法接收一个长整型的数组,用于设置手机静止和振动的时长,以毫秒为单位:下标为0的值表示手机静止的时长,下标为1的值表示手机振动的时长,下标为2的值又表示手机静止的时长,以此类推。
    3.如果想要通知到来的时候立刻振动1秒,代码如上所示。
    4.手机振动实际证明不需要声明权限。
    

    3.控制手机LED灯的显示:
    4.使用通知的默认效果:振动方式和铃声跟随系统:

    Notification notification = new NotificationCompat.Builder(this)
            .setContentTitle("This is content title")
            .setContentText("This is context text")
            .setWhen(System.currentTimeMillis())
            .setSmallIcon(R.mipmap.ic_launcher)
            .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher))
            .setContentIntent(pi)
            .setDefaults(NotificationCompat.DEFAULT_ALL)
            .setLights(Color.GREEN, 1000, 1000)
            .build();
            
    注意:
    1.LED灯的闪烁要在锁屏的状态下显示。
    2.LED灯的颜色可能受手机的定制原因,不是所有的颜色都起作用。
    

    F. 通知的高级功能

    • setStyle方法接收一个NotificationCompat.Style参数,这个参数就是用来构建具体的富文本信息的,如长文字,图片等。

    1.显示长文字:

    .setStyle(new NotificationCompat.BigTextStyle().bigText("【美媒称中国奇迹没有结束】“增长表现超出预期”,对于中国国家统计局公布的今年一季度6.9%的国内生产总值(GDP)增长率"))
    
    
    setStyle方法中创建一个NotificationCompat.BigTextStyle对象,这个对象就是用于封装长文字信息的,我们调用它的bigText方法并将文字内容传入就可以了。
    
    

    2.显示一张大图片:

    .setStyle(new NotificationCompat.BigPictureStyle().bigPicture(BitmapFactory.decodeResource(getResources(), R.drawable.fkq)))
    
    setStyle方法中创建一个NotificationCompat.BigPictureStyle对象,这个对象就是用于设置大图片的,然后调用它的bigPicture方法将图片传入。
    
    通过BitmapFactory的decodeResource方法将图片解析成Bitmap对象,再传入bigPicture方法就可以了。
    
    • setPriority方法用于设置通知的重要程度,一共5个常量值可选:
    1. PRIORITY_DEFAULT 表示默认的重要程序,和不设置效果一样。
    2. PRIORITY_MIN 表示最低的重要程度,系统可能只会在特定的场景才显示这条通知,比如用户下拉状态栏的时候。
    3. PRIORITY_LOW 表示较低的重要程度,系统可能会将这类通知缩小,或改变其显示的顺序,将其排在更重要的通知之后。
    4. PRIORITY_HIGH 表示较高的重要程度,系统可能会将这类通知放大,或改变其显示的顺序,将其排在比较靠前的位置。
    5. PRIORITY_MAX 表示最高的重要程度,这类通知消息必须要让用户立刻看到,甚至需要用户做出响应操作。
    .setPriority(NotificationCompat.PRIORITY_MAX)
    
    

    相关文章

      网友评论

          本文标题:Android Notification用法全解析

          本文链接:https://www.haomeiwen.com/subject/lateextx.html