package com.zjw.mymultimedia; import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.graphics.BitmapFactory; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.support.v7.app.NotificationCompat; import android.view.View; import android.widget.Button; //8.2 p283 使用通知 /* 当某个应用程序希望向用户发出一些提示信息,而该应用程序又不在前台运行时,可以借助通知来实现 发出一条通知后,手机最上方的状态栏中会显示一个通知的图标,下拉状态栏后可以看到通知的详细内容 */ //8.2.1 p283 通知的基本用法 /* 需要一个NotificationManager来管理通知 调用Context的getSystemService()来获得管理器 getSystemService()方法接收一个字符串参数用于确定获取的是系统的哪个服务 这里传入Context.NOTIFICATION_SERVICE NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); */ /* 接下来需要一个Builder构造器来创建Notification对象 由于android系统的每一个版本都会对通知这部分内容进行修改,API不稳定性问题在通知上尤其严重 所以要用support库中提供的兼容API support-v4库中提供了一个NotificationCompat类 使用这个类的构造器来创建Notification对象 Notification notification = new NotificationCompat.Builder(BaseUseOfNotification.this).build(); 可以在build之前连缀多个设置方法 Notification notification = new NotificationCompat.Builder(BaseUseOfNotification.this) .setContentTitle("This is content title") .setContentText("This is content text") .setWhen(System.currentTimeMillis()) .setSmallIcon(R.mipmap.icecream_01) .setLargeIcon(BitmapFactory.decodeResource(getResources(),R.mipmap.icecream_02)) .build(); */ /* 以上完成后,只需要调用NotificationManager的notify()方法就可以让通知显示出来 notify()方法接收两个参数 第一个参数:id,要保证为每一个通知所指定的id都是不同 第二个参数:Notification对象 可以写成:manager.notify(1,notificaton) */ //布局里写一个发送通知按钮 /* 要实现通知的点击效果,要用PendingIntent PendingIntent与Intent比较: 共同点:都可指明某一个意图,都可启动活动,启动服务以及发送广播等 不通点: Intent更倾向于去立即执行某个动作 PendingIntent更倾向于在某个合适的时机去执行某个动作 也可以把PendingIntent理解为延迟执行的Intent */ /* PendingIntent主要提供了几个静态方法用于获取PendingIntent的实例 可以根据需要使用getActivity(),getBroadcast(),getService()方法 接收四个参数: 第一个参数:Context 第二个参数:一般用不到,通常传入0即可 第三个参数:Intent对象,可以通过这个对象构建出PendingIntent的"意图" 第四个参数:用于确定PendingIntent的行为,有FLAG_ONE_SHOT,FLAG_NO_CREATE,FLAG_CANCEL_CURRENT,FLAG_UPDATE_CURRENT四种值可选,通常传入0即可 */ /* NotificationCompat.Builder这个构造器还可以再连缀一个setContentIntent()方法,接受的参数正是一个PendingIntent对象 */ //新建一个用来跳转的活动NotificationActivity,布局一个TextView /* 要实现点击通知跳转后通知消失的效果 (如果我们没有在代码中对该通知进行取消,它就会一直显示在系统的状态栏上) 方案一:在NotificationCompat.Builder中再连缀一个setAutoCancel()方法,参数传入true,点击通知自动消失 Notification notification = new NotificationCompat.Builder(BaseUseOfNotification.this) .setContentTitle("This is content title") .setContentText("This is content text") .setWhen(System.currentTimeMillis()) .setSmallIcon(R.mipmap.icecream_01) .setLargeIcon(BitmapFactory.decodeResource(getResources(),R.mipmap.icecream_02)) .setContentIntent(pi) .setAutoCancel(true) .build(); 方案二:显示地调用NotificationManager的cancel()方法将它取消(写在跳转后的类中),传入的参数是通知的id,前面notificationManager.notify(1,notification);的时候传入的 NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); notificationManager.cancel(1); */ //8.2.2 p289 通知的进阶技巧 /* NotificationCompat.Builder提供了丰富的API setSound(),可以在通知发出时播放一段音频,参数:Uri参数 每个手机的/system/media.audio/ringtones目录下都有很多的音频文件 例: Notification notification = new NotificationCompat.Builder(BaseUseOfNotification.this) ... .setSound(Uri.fromFile(new File("/system/media.audio/ringtones/Luna.ogg"))) .build(); */ /* 还可以再通知到来的时候让手机进行震动,使用vibrate属性 vibrate是一个长整型数组,用于设置手机静止和震动的时长,以毫秒为单位 下标为0的值表示手机静止的时长,下标为1的值表示手机震动的时长,下标为2的值又表示手机静止的时长,以此类推 如果想要手机在通知到来的时候立刻震动1秒,再静止1秒,再震动1 秒,代码可以写成 Notification notification = new NotificationCompat.Builder(BaseUseOfNotification.this) ... .setVibrate(new long[]{0,1000,1000,1000}) .build(); 需要声明权限:<uses-permission android:name="android.permission.VIBRATE"/>(我自己真机测试没申明权限也能震动??) */ /* 当有通知,且手机处于锁屏状态,控制手机前置Led灯闪烁,使用setLights()方法,接收三个参数 参数一:用于指定Led灯的颜色 参数二:用于指定Led灯亮起的时长,以毫秒为单位 参数三:用于指定Led灯暗去的时长,以毫秒为单位 如果想要实现Led灯以绿色的灯光一闪一闪的效果,可以写成(有别的灯可能会被覆盖掉,比如充电状态): Notification notification = new NotificationCompat.Builder(BaseUseOfNotification.this) ... .setLights(Color.GREEN,1000,1000) .build(); 如果不想自己设置铃声震动,可以直接使用通知的默认效果,代码如下 Notification notification = new NotificationCompat.Builder(BaseUseOfNotification.this) ... .setDefaults(NotificationCompat.DEFAULT_ALL) .build(); */ //8.2.3 p291 通知的高级功能 /* 继续API setStyle(),允许我们构建出富文本的通知内容,接受一个NotificationCompat.Style参数,该参数用来构建富文本信息,如长文字,图片 如果不使用该方法,而直接在setContentText()中设置长文字,将无法显示完整,多余部分会用省略号代替 使用NotificationCompat.BigtextStyle封装长文字信息,用bigText()传入参数 代码如下 Notification notification = new NotificationCompat.Builder(BaseUseOfNotification.this) ... .setStyle(new NotificationCompat.BigTextStyle().bigText("Learn how to" + "buile notifications,send and sync data, and use voice actions." + "Get the official Android IDE and developer tools to build apps for Android")) .build(); */ /* 除了显示长文字外,通知里还可以还可以显示一张大图片 代码如下 Notification notification = new NotificationCompat.Builder(BaseUseOfNotification.this) ... .setStyle(new NotificationCompat.BigPictureStyle().bigPicture(BitmapFactory.decodeResource(getResources(),R.drawable.c))) .build(); */ /* setPriority()设置通知的重要程度,接收一个整型参数,一共5个常量值可选: PRIORITY_DEFAULT表示默认的重要程度,和不设置效果是一样的 PRIORITY_MIN表示最低的重要程度,系统可能只会在特定的场景才会显示这条通知,比如用户下拉状态栏的时候 PRIORITY_LOW表示较低的重要程度,系统可能会将这类通知缩小,或改变其显示的顺序,将其排列在更重要的通知之后 PRIORITY_HIGH表示较高的重要程度,系统可能将这类通知放大,或改变其显示的顺序,将其排在比较靠前的位置 PRIORITY_MAX表示最高的重要程度,需要用户立刻看到,通知不再是系统状态栏显示的一个小图标,而是弹出一个横幅,并附带了通知的详细内容(需要在通知设置里面允许横幅) 代码如下 Notification notification = new NotificationCompat.Builder(BaseUseOfNotification.this) ... .setPriority(NotificationCompat.PRIORITY_MAX) .build(); */ public class BaseUseOfNotification extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_base_use_of_notification); Button button= (Button) findViewById(R.id.btn_send_notice); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent=new Intent(BaseUseOfNotification.this,NotificationActivity.class); PendingIntent pi=PendingIntent.getActivity(BaseUseOfNotification.this,0,intent,0); NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); Notification notification = new NotificationCompat.Builder(BaseUseOfNotification.this) .setContentTitle("This is content title") .setContentText("This is content text") .setWhen(System.currentTimeMillis()) .setSmallIcon(R.mipmap.icecream_01) .setLargeIcon(BitmapFactory.decodeResource(getResources(),R.mipmap.icecream_02)) .setContentIntent(pi) // .setAutoCancel(true) // .setSound(Uri.fromFile(new File("/system/media.audio/ringtones/Luna.ogg"))) // .setVibrate(new long[]{0,1000,1000,1000}) // .setLights(Color.GREEN,1000,1000) // .setDefaults(NotificationCompat.DEFAULT_ALL) // .setStyle(new NotificationCompat.BigTextStyle().bigText("Learn how to" + // "buile notifications,send and sync data, and use voice actions." + // "Get the official Android IDE and developer tools to build apps for Android")) // .setStyle(new NotificationCompat.BigPictureStyle().bigPicture(BitmapFactory.decodeResource(getResources(),R.drawable.c))) .setPriority(NotificationCompat.PRIORITY_MAX) .build(); notificationManager.notify(1,notification); } }); } }
转载于:https://my.oschina.net/u/3620480/blog/1476873