Notification-通知
该类为通知的跳转类:
1 package com.example.gaoji; 2 3 import android.app.Activity; 4 import android.app.Notification; 5 import android.app.NotificationManager; 6 import android.app.PendingIntent; 7 import android.content.Context; 8 import android.content.Intent; 9 import android.os.Bundle; 10 import android.support.v4.app.NotificationManagerCompat; 11 import android.text.Layout; 12 import android.view.Menu; 13 import android.view.MenuItem; 14 import android.view.View; 15 import android.view.ViewGroup.LayoutParams; 16 import android.widget.Button; 17 import android.widget.PopupWindow; 18 import android.widget.TextView; 19 /* 20 * 发送通知 21 */ 22 public class MainActivity2 extends Activity { 23 24 @Override 25 protected void onCreate(Bundle savedInstanceState) { 26 super.onCreate(savedInstanceState); 27 setContentView(R.layout.activity_main2); 28 TextView tv= (TextView) findViewById(R.id.textView1); 29 NotificationManager nm=(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 30 nm.cancel(MainActivity.id_n);//取消id为id_n的通知栏显示 31 String ms=getIntent().getStringExtra("ms");//获取对象发送的内容 32 tv.setText(ms); 33 } 34 }
通知的一些属性 :
对于这样来创建通知的来说:
Notification notification = new Notification(R.drawable.ic_launcher, "This is ticker text", System.currentTimeMillis());
控制手机的闪光灯
现在的手机基本上都会前置一个 LED 灯,当有未接电话或未读短信,而此时手机又处
于锁屏状态时,LED灯就会不停地闪烁,提醒用户去查看。我们可以使用ledARGB、ledOnMS、
ledOffMS 以及 flags 这几个属性来实现这种效果。ledARGB 用于控制 LED 灯的颜色,一般
有红绿蓝三种颜色可选。ledOnMS 用于指定 LED 灯亮起的时长,以毫秒为单位。ledOffMS
用于指定 LED 灯暗去的时长,也是以毫秒为单位。flags 可用于指定通知的一些行为,其中
就包括显示 LED 灯这一选项。所以,当通知到来时,如果想要实现 LED 灯以绿色的灯光一
闪一闪的效果,就可以写成:
notification.ledARGB = Color.GREEN;/为闪光灯设置颜色
notification.ledOnMS = 1000;//指定led灯亮起的时间(毫秒)
notification.ledOffMS = 1000;//指定led灭的时间(毫秒)
notification.flags = Notification.FLAG_SHOW_LIGHTS;//显示闪光灯
控制手机的声音:
比如说,我们手机的/system/media/audio/ringtones 目录下有一个 Basic_tone.ogg
音频文件,那么在代码中这样就可以这样指定:
Uri soundUri = Uri.fromFile(new File("/system/media/audio/ringtones/
Basic_tone.ogg"));
notification.sound = soundUri;
控制手机的振动:
除了允许播放音频外,我们还可以在通知到来的时候让手机进行振动,使用的是 vibrate
这个属性。它是一个长整型的数组,用于设置手机静止和振动的时长,以毫秒为单位。下标为 0 的值
表示手机静止的时长,下标为 1 的值表示手机振动的时长,下标为 2 的值又表示手
机静止的时长,以此类推。所以,如果想要让手机在通知到来的时候立刻振动 1 秒,然后静
止 1 秒,再振动 1 秒,代码就可以写成:
long[] vibrates = {0, 1000, 1000, 1000};
notification.vibrate = vibrates;//需要在xml文件中加入振动的权限
当然,如果你不想进行那么多繁杂的设置,也可以直接使用通知的默认效果,它会根据
当前手机的环境来决定播放什么铃声,以及如何振动,写法如下:
notification.defaults = Notification.DEFAULT_ALL;
注意,以上所涉及的这些高级技巧都要在手机上运行才能看得到效果,模拟器是无法表现出振动、以及 LED 灯闪烁等功能的。
2 1 package com.example.gaoji;
3 import android.app.Activity;
4 import android.app.Notification;
5 import android.app.Notification.Builder;
6 import android.app.NotificationManager;
7 import android.app.PendingIntent;
8 import android.content.Context;
9 import android.content.Intent;
10 import android.graphics.Color;
11 import android.os.Bundle;
12 import android.support.v4.app.NotificationCompat;
13 import android.support.v4.app.NotificationManagerCompat;
14 import android.text.Layout;
15 import android.util.Log;
16 import android.view.Menu;
17 import android.view.MenuItem;
18 import android.view.View;
19 import android.view.ViewGroup.LayoutParams;
20 import android.widget.Button;
21 import android.widget.PopupWindow;
22 import android.widget.RemoteViews;
23 /*
24 * 发送通知
25 */
26 public class MainActivity extends Activity {
27 public static final int id_n=0x1;
28 @Override
29 protected void onCreate(Bundle savedInstanceState) {
30 super.onCreate(savedInstanceState);
31 setContentView(R.layout.activity_main);
32 Button but = (Button) findViewById(R.id.button1);
33 Button but2 = (Button) findViewById(R.id.button2);
34 Button but3 = (Button) findViewById(R.id.button3);
35 Button but4 = (Button) findViewById(R.id.button4);
36 final Button but5 = (Button) findViewById(R.id.button5);
37 Button but6 = (Button) findViewById(R.id.button6);
38 but.setOnClickListener(new View.OnClickListener() {
39
40 @Override
41 public void onClick(View v) {
42 Notification.Builder builder=new Notification.Builder(MainActivity.this);
43 //设置通知的事件消息
44 builder.setTicker("你有一条新通知");
45 builder.setContentText("消息内容");
46 builder.setContentTitle("消息标题");
47
48 //设置通知的各种属性
49 //builder.setOngoing(true);//常驻通知,不能被取消掉
50 //builder.setAutoCancel(true);//取消声音震动呼吸灯(静音模式)和单击事件执行后取消显示,也可以在另一个activity中去关闭显示
51 builder.setDefaults(Notification.DEFAULT_ALL);//通知提示(声音震动呼吸灯)
52 //DEFAULT_ALL 使用所有默认值,比如声音,震动,闪屏等等
53 //DEFAULT_LIGHTS 使用默认闪光提示
54 //DEFAULT_SOUNDS 使用默认提示声音
55 //DEFAULT_VIBRATE 使用默认手机震动,需加上<uses-permission android:name="android.permission.VIBRATE" />权限
56 //FLAG_AUTO_CANCEL 该通知能被状态栏的清除按钮给清除掉
57 //FLAG_NO_CLEAR 该通知不能被状态栏的清除按钮给清除掉
58 //FLAG_ONGOING_EVENT 通知放置在正在运行
59 //FLAG_INSISTENT 是否一直进行,比如音乐一直播放,知道用户响应
60 builder.setNumber(1);//信息条数
61 builder.setWhen(System.currentTimeMillis());//获取时间
62 builder.setSmallIcon(android.R.drawable.ic_menu_manage);//设置图标
63
92 //设置通知的单击跳转
93 Intent intent=new Intent(MainActivity.this, MainActivity2.class);//activity之间的跳转,单击该通知的时候跳转
94 //startActivity(intent);执行这条代码可以直接跳转
95 intent.putExtra("ms", "消息内容");//键值对
96 PendingIntent pi=PendingIntent.getActivity(MainActivity.this,0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
97 builder.setContentIntent(pi);//状态栏跳转单击事件,实现跳转,activity必须在XML文件里注册
98 //获取系统的通知管理器
99 NotificationManager nm=(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
100
101 //将通知传递给管理者并自定义一个id,方便取消该id代表的通知的显示
102 nm.notify(id_n,builder.getNotification());//发送通知,id和通知对象
103 }
104 });
105 //大视图通知
106 but2.setOnClickListener(new View.OnClickListener() {
107
108 @Override
109 public void onClick(View v) {
110 NotificationCompat.Builder builder=new NotificationCompat.Builder(MainActivity.this);
111 builder.setContentText("文本");
112 builder.setContentTitle("标题");
113 builder.setSmallIcon(android.R.drawable.ic_dialog_map);//通知的图标
114 NotificationCompat.InboxStyle style=new NotificationCompat.InboxStyle();
115 style.setBigContentTitle("消息标题");
116 style.addLine("减肥萨克雷爱是减肥了俺看见了房间拉来的风景爱了解到");
117 style.setSummaryText("摘要文字本");
118 builder.setStyle(style);
119 NotificationManager nm=(NotificationManager) getSystemService(NOTIFICATION_SERVICE);
120 nm.notify(2, builder.build());
121 }
122 });
123 //进度条通知
124 but3.setOnClickListener(new View.OnClickListener() {
125 int progress_value=0;
126 @Override
127 public void onClick(View v) {
128 final NotificationCompat.Builder builder=new NotificationCompat.Builder(MainActivity.this);
129 builder.setContentText("正在下载...");
130 builder.setContentTitle("游戏");
131 builder.setSmallIcon(android.R.drawable.ic_dialog_map);
132 final NotificationManager nm=(NotificationManager) getSystemService(NOTIFICATION_SERVICE);
133 new Thread(new Runnable(){
134
135 @Override
136 public void run() {
137 for(progress_value=0;progress_value<100;progress_value=progress_value+5){
138 builder.setProgress(100,progress_value,false);//true代表不确定状态,参数代表最大进度和当前进度
139 try {
140 Thread.sleep(1000);
141 } catch (InterruptedException e) {
142 e.printStackTrace();
143 }
144 nm.notify(3,builder.build());//显示出来
145 }
146 builder.setProgress(0,0,false);//关闭进度条
147 nm.notify(3,builder.build());
148 }
149
150 }).start();
151 }
152 });
153 //自定义通知
154 but4.setOnClickListener(new View.OnClickListener() {
155 @Override
156 public void onClick(View v) {
157 Notification.Builder builder=new Notification.Builder(MainActivity.this);
158 builder.setSmallIcon(R.drawable.ic_launcher);//没有拉下来的提示图标(不写弹不出通知)
159 RemoteViews views=new RemoteViews(getPackageName(), R.layout.activity_main3);//自定义的布局文件
160 views.setTextViewText(R.id.textView1, "歌名");//通过id设置
161 views.setTextViewText(R.id.button5, "播放");//通过id为按钮设置文字
162 builder.setContent(views);//远程视图,当前包名,自定义的xml布局文件
163 NotificationManager nm=(NotificationManager) getSystemService(NOTIFICATION_SERVICE);
164 nm.notify(4, builder.getNotification());//id,通知对象(可通过这个id取消显示和更新)
165
166 }
167 });
168 }
169
170 @Override
171 public boolean onCreateOptionsMenu(Menu menu) {
172 // Inflate the menu; this adds items to the action bar if it is present.
173 getMenuInflater().inflate(R.menu.main, menu);
174 return true;
175 }
176
177 @Override
178 public boolean onOptionsItemSelected(MenuItem item) {
179 // Handle action bar item clicks here. The action bar will
180 // automatically handle clicks on the Home/Up button, so long
181 // as you specify a parent activity in AndroidManifest.xml.
182 int id = item.getItemId();
183 if (id == R.id.action_settings) {
184 return true;
185 }
186 return super.onOptionsItemSelected(item);
187 }
188 }
适配8.0
private void showMessageNotification(Context context){ final int pushId = 1; NotificationManager mNotificationManager = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE); NotificationCompat.Builder mBuilder; //判断是否是8.0Android.O if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { //创建一个通知渠道(渠道id与渠道名) NotificationChannel chan1 = new NotificationChannel("渠道id", "渠道名", NotificationManager.IMPORTANCE_DEFAULT); chan1.setLightColor(Color.GREEN); chan1.setLockscreenVisibility(Notification.VISIBILITY_PRIVATE); mNotificationManager.createNotificationChannel(chan1); mBuilder = new NotificationCompat.Builder(context, "渠道id"); } else { mBuilder = new NotificationCompat.Builder(context,"渠道id"); } Intent notificationIntent = new Intent(context, MainActivity.class); notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); notificationIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); PendingIntent intent = PendingIntent.getActivity(context, 0,notificationIntent, 0); mBuilder.setContentTitle("在线客服消息")//设置通知栏标题 .setContentText("内容")//设置通知栏内容 .setContentIntent(intent) //设置通知栏点击意图 .setNumber(1) //设置通知集合的数量 .setTicker("收到一条在线客服消息") //通知首次出现在通知栏,带上升动画效果的 .setWhen(System.currentTimeMillis())//通知产生的时间,会在通知信息里显示,一般是系统获取到的时间 .setDefaults(Notification.DEFAULT_ALL)//向通知添加声音、闪灯和振动效果的最简单、最一致的方式是使用当前的用户默认设置,使用defaults属性,可以组合 .setSmallIcon(R.mipmap.ic_launcher);//设置通知小ICON Notification notify = mBuilder.build(); notify.flags |= Notification.FLAG_AUTO_CANCEL; mNotificationManager.notify(pushId, notify); }