http://www.cnblogs.com/plokmju/p/android_Notification.html
http://www.2cto.com/kf/201401/274525.html
与AlertDialog的创建一样,notification也可以通过内部类Builder来创建并设置其中的一些信息。但Notification必须通过系统服务NotificationManager来发送或者取消。如:
manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); Button gv_list = (Button) findViewById(R.id.btn_notify); gv_list.setOnClickListener(new OnClickListener() { public void onClick(View v) { Notification.Builder builder = new Notification.Builder( MainActivity.this); builder.setAutoCancel(true); // 接收后在状态栏上显示的内部(不下拉时显示的内部),如果内部过长,会自动进行翻滚播放 builder.setTicker("你有一条未读通知"); builder.setContentTitle("contentTitle").setContentText("contentText"); builder.setSmallIcon(R.drawable.emoji_1f601);// 有两个用处:未下拉时显示的图标,下拉后显示的小图标 builder.setLargeIcon(BitmapFactory.decodeResource( getResources(), R.drawable.ic_launcher)); builder.setContentInfo("contentInfo"); builder.setNumber(2);//设置该通知的个数。 builder.setWhen(System.currentTimeMillis()-1000*60*10);//设置通知的时间 //设置点击通知时要执行的Activity,此处是打开系统图库 Intent in = new Intent(); in.setAction(Intent.ACTION_PICK); in.setType("image/*"); PendingIntent intent = PendingIntent.getActivity( getApplicationContext(), 0, in, PendingIntent.FLAG_UPDATE_CURRENT); builder.setContentIntent(intent); Notification build = builder.build(); manager.notify(0, build);//发送通知 }
注意:必须要调用的三个方法是:setSmallIcon(),setContentTitle()与setContentText()。
只需要调用builder.setProgress()即可。如:
new Thread(new Runnable() { @Override public void run() { int incr; for (incr = 0; incr <= 100; incr += 5) { builder.setProgress(100, incr, false); manager.notify(0, builder.build()); try { Thread.sleep(300); } catch (InterruptedException e) { } } builder.setContentText("完成") .setProgress(0, 0, false); manager.notify(0, builder.build());//把notification的id设置成一样的,这样就可以进行更新 } }).start();
上面使用的是系统自带的带进度条的notification,也可以自定义一个,代码如下:
final RemoteViews views = new RemoteViews(getPackageName(), R.layout.second); builder.setContent(views);//设置通知的显示view new Thread(new Runnable() { public void run() { int incr; for (incr = 0; incr <= 100; incr += 5) { views.setProgressBar(R.id.progressbar, 100, incr, false); manager.notify(0, builder.build());//一定要调用这个方法,不然不会出现进度条更新 try { Thread.sleep(300); } catch (InterruptedException e) { } } views.setTextViewText(R.id.tv, "下载完成"); manager.notify(0, builder.build()); } }).start();
通过Builder设置的话,需要的版本比较高。如果要兼容低版本就需要通过Notification自身的一些属性进行设置。如:
Notification n = new Notification(); n.icon = R.drawable.ic_launcher;//状态栏上的图标 n.tickerText = "您有新的反馈信息";//状态栏上的提示文字 n.when = SystemClock.elapsedRealtime();//发送通知的时间 n.flags = Notification.FLAG_AUTO_CANCEL; //下拉后显示的样子 RemoteViews view = new RemoteViews(getPackageName(), R.layout.main); view.setTextViewText(R.id.tv1, "这是test");//为布局中的textview设置文字 //为布局中的iamgeview设置图片 view.setImageViewResource(R.id.iv, R.drawable.ic_launcher); n.contentView = view; //点击通知时调用的intent Intent intent = new Intent(MainActivity.this, SecondActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_SINGLE_TOP); intent.putExtra("id", ++i); //加上action是为了区别不能的intent,从而可以使不同的通知打开同一个界面 intent.setAction("action"+i); PendingIntent pIntent = PendingIntent.getActivity( MainActivity.this, 200, intent, PendingIntent.FLAG_ONE_SHOT); n.contentIntent = pIntent; nm.notify(i, n);上述是一些基本的设置,还可以设置声音、振动以及呼吸灯等。
使用默认声音时只需要设置
n.defaults = Notification.DEFAULT_SOUND;使用自定义声音:
n.sound = Uri.fromFile(tipFile);//使用项目中指定的声音当然也可以使用系统本身就带有的:
n.sound = Uri.withAppendedPath(Audio.Media.INTERNAL_CONTENT_URI, "1");默认时,通知的声音播放一遍就结束。如果让声音循环播放,需要为flags参数加上FLAG_INSISTENT。这样声音会到用户响应才结束。
默认的:
n.defaults = Notification.DEFAULT_VIBRATE;自定义的:
long[] vibrate = {0,200,100,400}; n.vibrate = vibrate ;
使用灯的时候,flags必须有Notification.FLAG_SHOW_LIGHTS.
默认的:
n.defaults = Notification.DEFAULT_LIGHTS;自定义:
n.ledARGB = 0x0afaade9; n.ledOffMS = 100; n.ledOnMS = 100;
处于状态栏中的notification是可以处理点击事件的。只要调用RemoteViews.setOnClickPendingIntent()即可。如:
Intent ci = new Intent(MainActivity.this, TestService.class); PendingIntent cpi = PendingIntent.getService(MainActivity.this, 0, ci, PendingIntent.FLAG_UPDATE_CURRENT); rv.setOnClickPendingIntent(R.id.mid_left, cpi);//第1个参数指的是点击的view的id,第二个参数指点击时的操作由于点击时要指定一个PendingIntent,因为可以通过启动一个Service或者Activity来完成点击事件。