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
本文深入讲解Android系统中通知的创建、展示及高级功能,包括如何使用NotificationManager和NotificationCompat.Builder,以及如何设置通知的样式、优先级和行为。
602

被折叠的 条评论
为什么被折叠?



