• 第一行代码 Android 第八章8.1-8.2(通知的基本用法和功能)


    第八章:丰富你的程序——运用手机多媒体
            Android在这方面也做的非常出色,它提供了一系列的API,使得我们可以在程序中调用很多手机的多媒体资源,从而编写出更加丰富多彩的应用程序。

    8.1 将程序运行到手机上
    8.2 使用通知
            通知(Notification)是Android系统中比较有特色的一个功能,当某个应用程序希望向用户发出一些提示信息,而该应用程序又不在前台运行时,就可以借助通知来实现。发出一条通知后,手机最上方的状态栏中会显示一个通知图标,下拉状态栏后就可以看到通知的详细内容了。
    8.2.1 通知的基本用法
            通知的用法还是比较灵活的,既可以在活动里创建,也可以在广播接收器里创建,当然还可以在下一章中我们即将学习的服务里创建。相比于广播接收器和服务,在活动力创建通知的场景还是比较少的,因为一般只有当程序进入到后台的时候我们才需要使用通知。

    1. //创建通知的详细步骤:
    2. //1)需要一个NotificationManager来对通知进行管理,可以调用Context的getSystemService方法获取到。
    3. NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE)
    4. //2) 接下来需要使用一个Builder构造器来创建Notification对象(使用support-v4库中提供的NotificationCompat类的构造器来创建)
    5. Notification notification = new NotificationCompat.Builder(context).build(); //这是一个空的Notification对象
    6. //3)最后只需要调用NotificationManager的notify()方法就可以让通知显示出来了。
    7. //notify()方法接收两个参数,一个是id(要保证为每个通知所指定的id都是不同的),一个是Notification对象
    8. manager.notify(1,notification);
    1. //在最终的build()方法之前连缀任意多的设置方法来创建一个丰富的Notification对象
    2. NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE)
    3. Notification notification = new NotificationCompat.Builder(context).setContentTitle("This is content title") /*指定通知的标题内容*/ .setContentText("This is content text") /*指定通知的正文内容*/.setWhen("System.currentTimeMillis()) /*指定通知被创建的时间,以毫秒为单位*/.setSmallIcon(R.drawable.small_icon) /*用于设置通知的小图标*/.setLargeIcon(BitmapFactory.decodeResource(getResources(),R.drawable.large_icon))/*用于设置通知的大图标*/.build();

    到这里就把创建通知的每一个步骤都分析完了,下面就通过一个具体的例子来看一看通知到底是长什么样儿的。

    1. //新建一个NotificationTest项目,并修改activity_main.xml
    2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    3. android:orientation="vertical"
    4. android:layout_width="match_parent"
    5. android:layout_height="match_parent">
    6. <Button
    7. android:id="@+id/send_notice"
    8. android:layout_width="wrap_content"
    9. android:layout_height="wrap_content"
    10. android:text="Send notice" />
    11. LinearLayout>
    1. //布局文件只有一个Send notice按钮,用于发出一条通知
    2. //接下来修改MainActivity中的代码
    3. public class MainActivity extends AppCompatibleActivity implements View.OnClickListener {
    4. @Override
    5. protected void onCreate(Bundle savedInstanceState) {
    6. super.onCreate(savedInstanceState);
    7. setContentView(R.layout.activity_main);
    8. Button sendNotice = (Button) findViewById(R.id.send_notice);
    9. sendNotice.setOnClickListener(this);
    10. }
    11. @Override
    12. public void onClick(View v) {
    13. switch (v.getId()) {
    14. case R.id.send_notice:
    15. NotificationManager manager = (NotificationManager) getSysytemService(NOTIFICATION_SERVICE);
    16. Notification notification = new NotificationCompat.Builder(context).setContentTitle("This is content title").setContentText("This is content text".setWhen("System.currentTimeMillis()).setSmallIcon(R.drawable.small_icon)".setLargeIcon(BitmapFactory.decodeResource(getResources(),R.drawable.large_icon)).build();
    17. manager.notify(1,notfication);
    18. break;
    19. default:
    20. break;
    21. }
    22. }
    23. }

    注意:做完以上操作后,点击该通知发现没反应,想要实现通知的点击效果,我们还需要在代码中进行相应的设置,这就涉及了新概念PendingIntent。
    PendingIntent:它和Intent有些类似,他们都可以去指明某一个意图,都可以用于启动活动,启动服务以及发送广播等。
                              不同在于Intent更加倾向于去立即执行某个动作,而PendingIntent更加倾向于在某个合适的时机去执行某个动作。所以可以把他理解为延迟执行的Intent。

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

            这几个方法的参数都是一样的;

    分别为:Context,0,Intent对象,(FLAG_ONE_SHOT)/ (FLAG_NO_CREATE)/ (FLAG_CANCEL_CURRENT)/(FLAG_UPDATE_CURRENT)/(通常0)

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

    1. //新建一个NotificationActivity,布局起名notification_layout
    2. //修改notification_layout
    3. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    4. android:layout_width="match_parent"
    5. android:layout_height="match_parent">
    6. <TextView
    7. android:layout_width="wrap_content"
    8. android:layout_height="wrap_content"
    9. android:layout_centerInParent="true"
    10. android:textSize="24sp"
    11. android:text="This is notification layout"
    12. />
    13. RelativeLayout> //相对布局
    1. //接下来修改MainActivity中的代码
    2. //先新建一个intent,在将intent传入PendingIntent,最后用setContentIntent(pi)接收一个PendingIntent对象
    3. public class MainActivity extends AppCompatibleActivity implements View.OnClickListener {
    4. ...
    5. @Override
    6. public void onClick(View v) {
    7. switch (v.getId()) {
    8. case R.id.send_notice:
    9. //使用Intent表达我们想要启动NotificationActivity的“意图”
    10. Intent intent = new Intent(this,NotificationActivity.class);
    11. //将构建好的intent传入到PendingIntent.getActivity方法里
    12. PendingIntent pi = PendingIntent.getActivity(this,0,intent,0);
    13. NotificationManager manager = (NotificationManager) getSysytemService(NOTIFICATION_SERVICE);
    14. Notification notification = new NotificationCompat.Builder(context).setContentTitle("This is content title").setContentText("This is content text".setWhen("System.currentTimeMillis()).setSmallIcon(R.drawable.small_icon)".setLargeIcon(BitmapFactory.decodeResource(getResources(),R.drawable.large_icon)).setContentIntent(pi)/*接收一个PendingIntent对象*/.build();
    15. manager.notify(1,notfication);
    16. break;
    17. default:
    18. break;
    19. }
    20. }
    21. }

    注意:如果我们没有在代码中对该通知进行取消,他就会一直显示在系统的状态栏
    解决办法:1)在NotificationCompat.Builder中再连缀一个setAutoCancel()方法

                      2)显式调用NotificationManager的cancel方式将它取消

    1. //1)
    2. Notification notification = new NotificationCompat.Builder(this).setAutoCancel(true).build();
    3. //2)
    4. public class NotificationActivity extends AppCompatActivity {
    5. @Override
    6. protected void onCreate(Bundle savedInstanceState) {
    7. super.onCreate(savedInstanceState);
    8. setContentView(R.layout.notification_layout);
    9. NotificationManager manager = (NotificationManager) getSysytemService(NOTIFICATION_SERVICE);
    10. manager.cancel(1); //这里的1是通知的id,对应manager.notify(1,notification)中的1
    11. }
    12. }

    8.2.2 通知的进阶技巧
            setSound()可以在通知发出的时候播放一段音频,这样能够更好地告知用户有通知的到来。

    1. //setSound方法接收一个Uri参数,所以在指定音频文件的时候还需要先获取到音频文件对应的URI
    2. //在手机的/system/media/audio/ringtones目录下选取的音频文件
    3. Notification notification = new NotificationCompat.Builder(this).setSound(Uri.fromFile(new File("/system/media/audio/ringtones/Luna.ogg"))).build();

            vibrate:是一个长整型数组,用于设置手机静止和振动的时长,以毫秒为单位
                    参数分别表示:手机静止时长,手机振动的时长,又表示时间静止的时长...

    1. //表示让手机在通知到来的时候立刻振动1秒,然后静止1秒,再振动1秒(以毫秒为单位)
    2. Notification notification = new NotificationCompat.Builder(this).setVibrate(new long[] {0,1000,1000,1000}).build();
    1. //想要控制手机的振动还要声明权限,还得编辑AndroidManifest.xml文件
    2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    3. package="com.example.notificationtest"
    4. android:versionCode="1"
    5. android:versionName="1.0" >
    6. ...
    7. <uses-permission android:name="android.permission.VIBRATE"/>
    8. ...
    9. manifest>

            setLights(Color.GREEN,1000,1000)     //实现LED灯一闪一闪的效果
            作用及参数:当有未接电话或未读短信时,可以让LED灯闪烁提醒用户去看
                                    参数分别为:LED灯的颜色,LED灯亮起的时长,LED灯暗去的时长
             setDefaults(NotificationCompat.DEFAULT_ALL)  //直接使用通知的默认效果

    8.2.3  通知的高级功能
            正常情况下,若通知的正文部分较多,通知内容是无法显示完整的,多余的部分会用省略号代替,但是如果真的非常需要在通知当中显示一长段文字,Android也是支持的,通过setStyle()就可以做到。

    1. //通知里显示长文本
    2. //new NotificationCompat.BigTextStyle()方法是用来封装长文字信息的,调用它的bigText将文字传入就行
    3. Notification notification = new NotificationCompat.Builder(this).setStyle(new NotificationCompat.BigTextStyle().bigText("dhwih hfioeafew fhalhfeuw fhewioqpfe fheaofhewdhiow fehiwoqfheiow fheiowqufeiw fhewioqfpeiw fheiwoqf.")).build();
    1. //通知里显示大图片
    2. //通过BitmapFactory的decodeResources()方法将图片解析成Bitmap对象
    3. Notification notification = new NotificationCompat.Builder(this).setStyle(new NotificationCompat.BigPictureStyle().bigPicture(BitmapFactory.decodeResources(getResoruces(),,R.drawable.big_image))).build();

          setPriority(整型参数)方法用于设置通知的重要程度,它接收一个整型参数,五个常量值可选,分别为: 
                    1)PRIORITY_DEFAULT    默认程度
                    2)PRIORITY_MIN             最低重要程度
                    3)PRIORITY_LOW            较低重要程度:系统可能会将它缩小排在后面
                    4)PRIORITY_HIGH           较高重要程度:系统可能会改变他的位置排在前面
                    5)PRIORITY_MAX            最高重要程度:这类通知消息必须要让用户立刻看到

  • 相关阅读:
    深度学习基础汇总
    Python异步编程之web框架 异步vs同步 文件IO任务压测对比
    【能效管理】关于学校预付费水电系统云平台应用分析介绍
    ICMP协议(一)
    面试官:说说SSO单点登录的实现原理?
    深度学习---确保每次训练结果一致的方法
    Android 基础知识1-开发环境搭建
    获取文件时间并且将时间进行转换
    C语言用筛选法求 100 之内的素数(挖去 1,被除数平方根)
    AI 与大模型引新安全威胁?亚马逊云科技与领创集团的探索和实践
  • 原文地址:https://blog.csdn.net/XXX_17/article/details/125987434