安卓中创建通知需要借助NotificationManager来对通知进行管理。可以调用Context的getsSystemService()方法来获得。 getsSystemService()方法接收一个参数,这个参数是字符串,用于指定哪一个服务。Context.NOTIFICATION_SERVICE 就是指定通知服务。 这个方法返回一个Object对象,所欲需要进行强制转换。
NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
- 创建Notification对象
1.安卓API Level 11 以下
Notification notification = new Notification(R.drawable.ic_launcher, "This is ticker text", System.currentTimeMillis());
安卓文档中写了 Notification(int icon, CharSequence tickerText, long when) This constructor was deprecated in API level 11. Use Notification.Builder
instead.
也就是说在安卓API Level 11 以上这种方法创建Notification已经无效了。
2.高于安卓API Level 11 低于 API Level 16
用Notification.Builder来构建,可以用getNotification()来获取Notification对象。不过文档中写了getNotification() This method was deprecated in API level 16. Use build()
instead.
也就是说getNotification()方法获得Notification对象在安卓API Level 16以上已经无效。
3.高于安卓API Level 16
使用Notification.Builder来构建,调用Builder的build()来获取对象。
- Notification设置布局
Notification.Builder有很多方法来构建通知的布局。这里给出一段代码:
package com.example.notificationtest; import java.io.File; import android.app.Activity; import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class MainActivity extends Activity implements OnClickListener{ private Button sendNotice; private int num; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); num = 0; setContentView(R.layout.activity_main); sendNotice = (Button) findViewById(R.id.send_notice); sendNotice.setOnClickListener(this); } @Override public void onClick(View v) { // TODO Auto-generated method stub switch (v.getId()) { case R.id.send_notice: Intent intent = new Intent(MainActivity.this,NotificationActivity.class); intent.putExtra("id", ++num); //跳转的Intent 第一个参数Context 第二个参数文档解释Private request code for the sender //第三个参数intent 第四个参数flags PendingIntent pi = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); //调用提示音 Uri soundUri = Uri.fromFile(new File("/system/media/audio/ringtones/01_Piano.ogg")); //调用震动 是一个long型的数组第0个表示几秒后震动 第1个数震动多久 第2个数等待多久 依次类推 long[] vibrates = {0,100}; NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); Notification notification = new Notification.Builder(this) .setDefaults(Notification.DEFAULT_ALL) //通知默认的声音 震动 呼吸灯 .setTicker("This is Ticker") //状态栏显示的文字 .setContentTitle("This is title") //设置下拉栏中通知的第一行 .setContentText("This is Text") //设置下拉栏中通知的第二行 .setSubText("This is SubText") //设置下拉栏中通知的第三行 .setSmallIcon(R.drawable.ic_launcher) //设置状态栏的小图标 //.setLargeIcon(b) //设置下拉栏中的大图标 .setContentIntent(pi) //跳转的Intent .setSound(soundUri) //设置通知音效 .setVibrate(vibrates) //设置震动效果 .build(); //构建Notification manager.notify(num,notification); //显示notification 第一个参数表示id值 break; default: break; } } }
震动需要在AndroidManifest.xml中加入声明 :
<uses-permission android:name="android.permission.VIBRATE" />
我们通过通知进入到另外一个活动中时,需要将通知从状态栏上除去。可以在启动的活动中调用NotificationManager的cancel()方法,接收1个参数,即该通知的id值。
- PendingIntent.getActivity()方法第四个参数值:
FLAG_UPDATE_CURRENT:如果PendingIntent已经存在,保留它并且只替换它的extra数据。会更新之前PendingIntent的消息,比如,你推送了消息1,并在其中的Intent中putExtra了一个值“ABC”,在未点击该消息前,继续推送第二条消息,并在其中的Intent中putExtra了一个值“CBA”,好了,这时候,如果你单击消息1或者消息2,你会发现,他俩个的Intent中读取过来的信息都是“CBA”,就是说,第二个替换了第一个的内容。
FLAG_CANCEL_CURRENT时:如果PendingIntent已经存在,那么当前的PendingIntent会取消掉,然后产生一个新的PendingIntent依然是上面的操作步骤,这时候会发现,点击消息1时,没反应,第二条可以点击。
FLAG_ONE_SHOT:PendingIntent只能使用一次。调用了实例方法send()之后,它会被自动cancel掉,再次调用send()方法将失败。
FLAG_NO_CREATE:如果PendingIntent不存在,简单了当返回null。
到这里学习了安卓通知的一般用法。