1、获得系统服务
notificationmanager=(NotificationManager) context.getSystemService(NOTIFICATION_SERVICE);
2、创建Notification
notification=new Notification(R.drawable.keai,"可爱",System.currentTimeMillis());
3、对Notification进行一些设置
notification.flags=Notification.FLAG_AUTO_CANCEL; //设置下拉点击之后回到应用程序,可以有多个值选择
4、Intent与PendingIntent
Intent intent=new Intent(this,Z18Activity.class);
pendingintent=PendingIntent.getActivity(this,0,intent,0);
notification.setLatestEventInfo(this,"真可爱","太可爱啦!",pendingintent);
5、可更改提示下拉条中的布局
RemoteViews rv=new RemoteViews(this.getPackageName(),R.layout.main); //此步骤是修改下拉后看到提示条的布局
notification.contentView=rv;
6、用NotificationManager发送Notification提示信息
notificationmanager.notify(0,notification); //通过标识发送指定的Notification
上面有些步骤是属于并列的,可能后面的操作将覆盖前面的操作
Example1:
Ticker Text:Notification刚出来的时候,在状态栏上滚动的字幕,如果很长,会自动分割滚动
Content Title:Notification展开后的标题
Content Text:Notification展开后的内容
取得NotificationManage
- private NotificationManager mNotificationManager;
- mNotificationManager = (NotificationManager)
- getSystemService(Context.NOTIFICATION_SERVICE);
创建Notification并且显示
-
- String tickerText = "My notification, It's a long text! Hello World desiyo?";
-
- int icon = R.drawable.icon_02241_3;
-
-
-
- String contentTitle="My notification";
-
- String contentText="Hello World!";
-
-
- Intent notificationIntent = new Intent(this, this.getClass());
- notificationIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
- PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
- notificationIntent, 0);
-
-
- Notification notification = new Notification(icon, tickerText, System.currentTimeMillis());
-
- notification.defaults |= Notification.DEFAULT_SOUND;
-
- notification.defaults |= Notification.DEFAULT_VIBRATE;
-
-
- notification.flags|=Notification.FLAG_AUTO_CANCEL;
- notification.setLatestEventInfo(this, contentTitle, contentText, contentIntent);
-
-
- mNotificationManager.notify(HELLO_ID, notification);
这是最基本的应用,可以说除了找个合适的图标以外,其它都很简单。
使用自定义View的Notification
同Toast一样,我们也可以自已指定1个View来作为Notification展开后的显示内容,比如说在Android Market中下载的时候,Notification中会显示当前下载的进度,那么我们也来模拟1个这样的效果吧。
首先给出View的定义文件:notification_view_sample.xml
- "1.0" encoding="utf-8"?>
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:padding="3dp"
- >
- "@+id/notificationImage"
- android:layout_width="wrap_content" android:layout_height="wrap_content"
- android:src="@android:drawable/stat_sys_download"
- />
- "@+id/notificationTitle"
- android:layout_width="wrap_content" android:layout_height="wrap_content"
- android:layout_toRightOf="@id/notificationImage"
- android:layout_alignParentRight="true"
- android:paddingLeft="6dp"
- android:textColor="#FF000000"
- />
- "@+id/notificationPercent"
- android:layout_width="wrap_content" android:layout_height="wrap_content"
- android:layout_below="@id/notificationImage"
- android:paddingTop="2dp"
- android:textColor="#FF000000"
- />
- "@+id/notificationProgress"
- android:layout_width="wrap_content" android:layout_height="wrap_content"
- android:layout_below="@id/notificationTitle"
- android:layout_alignLeft="@id/notificationTitle"
- android:layout_alignParentRight="true"
- android:layout_alignTop="@id/notificationPercent"
- android:paddingLeft="6dp"
- android:paddingRight="3dp"
- android:paddingTop="2dp"
- style="?android:attr/progressBarStyleHorizontal"
- />
-
-
- String tickerText1 = "Custom view for download notification";
-
- int icon1 = android.R.drawable.stat_sys_download;
-
-
- Intent notificationIntent1 = new Intent(this, this.getClass());
- notificationIntent1.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
- PendingIntent contentIntent1 = PendingIntent.getActivity(this, 0, notificationIntent1, 0);
-
-
- Notification notification1 = new Notification(icon1, tickerText1, System.currentTimeMillis());
-
- notification1.defaults |= Notification.DEFAULT_SOUND;
-
- notification1.defaults |= Notification.DEFAULT_VIBRATE;
-
-
-
- notification1.flags|=Notification.FLAG_ONGOING_EVENT;
-
-
- RemoteViews contentView = new RemoteViews(getPackageName(), R.layout.notification_view_sample);
- contentView.setTextViewText(R.id.notificationTitle, "Download:Facebook for android");
- contentView.setTextViewText(R.id.notificationPercent, "35%");
- contentView.setProgressBar(R.id.notificationProgress, 100, 35, false);
-
- notification1.contentView = contentView;
- notification1.contentIntent=contentIntent1;
-
-
- mNotificationManager.notify(CUSTOM_VIEW_ID, notification1);
注意以上代码中使用的是RemoteViews,而不是普通的View,另外使用的是PendingIntent而不是普通的Intent,这都说明了Notification是1个“远程”的东西,其中能够使用的控件是受限制的,比如说TableLayout就不能使用。看下效果图,是不是和Market中的界面很接近呢?
由于在使用自定义的view时不必使用setLastEventInfo()方法,所以你必须为Notification的contentIntent域定义一个Intent,如下所示:
- RemoteViews contentView = new RemoteViews(getPackageName(),R.layout.notification_view);
- contentView.setTextViewText(R.id.notificationTitle, "下载文件:测试文件");
- contentView.setTextViewText(R.id.notificationPercent, "55%");
- contentView.setProgressBar(R.id.notificationProgress, 100, 55, false);
-
- notice.contentView = contentView;
- notice.contentIntent = contentIntent;
注意:当为notification创建自定义的布局时,你必须确保它能够再不同的设备方向以及分辨率下都正常工作。这对于所有的布局工作都是十分重要的,所以,不要定义过于复杂的布局,而且要在多种情况下进行测试。
更好的控制Notification动画图标怎么做?
和selector类似,定义1个XML文件放在drawable下,下面是之前用到的stat_sys_download的定义:
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:oneshot="false">
-
- "@drawable/stat_sys_download_anim0"
android:duration="200" />
-
- "@drawable/stat_sys_download_anim1"
android:duration="200" />
-
- "@drawable/stat_sys_download_anim2"
android:duration="200" />
-
- "@drawable/stat_sys_download_anim3"
android:duration="200" />
-
- "@drawable/stat_sys_download_anim4"
android:duration="200" />
-
- "@drawable/stat_sys_download_anim5"
android:duration="200" />
-
如何更新Notification?
注意到前面的代码中用到的CUSTOM_VIEW_ID,这是Notification的ID,如果2次弹出的Notification的ID相同,那么Notification就只会更新而不会再次滚动提醒。之前给出的ProgressBar是不会动的,利用这个方法就可以让它动起来(或者也可以直接调用RemoteView的set方法来直接更新?未试验)
如何自定义提示的声音和振动?
//自定义提示音notification.sound = Uri.parse("file:///sdcard/notification/ringer.mp3");
//自定义振动方式long[] vibrate = {0,100,200,300};notification.vibrate = vibrate;
请注意:如果使用了DEFAULT_SOUND或DEFAULT_VIBRATE,则自定义的提示音和振动无效。
在类似于短消息的应用中如何提示数量?
使用Notification的number属性,默认为0,如果是1或更大的数字,则会在图标上覆盖显示这个数字。
notification.number=notificationNumber;
Flag的使用
notification有1个flag属性,除了DEFAULT_SOUND之外,还有几个很有用的属性。
FLAG_AUTO_CANCEL:自动清除Notification,前面的例子中有用到
FLAG_INSISTENT:提示音一直不停,直至用户响应(很吵吧!)
FLAG_ONGOING_EVENT:表示这是1个正在进行的任务,不可以清除,第2个例子中有用到
FLAG_NO_CLEAR:不可以清除
实例来源:
http://www.apkbus.com/forum.php?mod=viewthread&tid=20486
参考:http://www.apkbus.com/forum.php?mod=viewthread&tid=19156
Example2:
- Button btn4 = (Button) this.findViewById(R.id.btn4);
- btn4.setText("发出一个通知(Notification)");
- btn4.setOnClickListener(new Button.OnClickListener() {
- public void onClick(View v) {
-
- NotificationManager nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
-
-
- PendingIntent contentIntent = PendingIntent.getActivity(
- Main.this, 0, new Intent(Main.this, NotificationView.class), 0);
-
-
- Notification n = new Notification(R.drawable.icon01, "我是滚动的通知信息我是滚动的通知信息我是滚动的通知信息", System.currentTimeMillis());
-
-
- n.setLatestEventInfo(Main.this, "通知发送人", "我是详细的通知信息我是详细的通知信息我是详细的通知信息", contentIntent);
-
-
- n.vibrate = new long[] { 100, 250, 100, 500 };
-
-
- nm.notify(0, n);
- }
- });
-
- public class NotificationView extends Activity {
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.view);
-
- TextView txtMsg = (TextView)this.findViewById(R.id.txtMsg);
- txtMsg.setText("点通知之后所链接到的 Activity");
-
- NotificationManager nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
-
- nm.cancel(0);
-
-
-
- }
- }
...
Example3:
- public class NotificationActivity extends Activity implements OnClickListener {
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.notification);
- findViewById(R.id.notificationBtn).setOnClickListener(this);
- }
-
- @Override
- public void onClick(View arg0) {
-
- addNotification();
- }
-
- private void addNotification() {
- NotificationManager manager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);
- Notification notification = new Notification();
- notification.icon = R.drawable.icon;
- notification.tickerText = "我在这里";
- notification.defaults = Notification.DEFAULT_SOUND;
- notification.audioStreamType = android.media.AudioManager.ADJUST_LOWER;
-
- Intent intent = new Intent(this, Notification2Activity.class);
-
- PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_ONE_SHOT);
- notification.setLatestEventInfo(this, "短信通知", "亲爱的,晚上8点老地方见哦~", pendingIntent);
- manager.notify(R.drawable.icon, notification);
- }
- }
- public class Notification2Activity extends Activity implements OnClickListener {
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.notification2);
- findViewById(R.id.cancleBtn).setOnClickListener(this);
- }
-
- @Override
- public void onClick(View v) {
-
- cancleNotification();
- }
-
- private void cancleNotification() {
-
- NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
- manager.cancel(R.drawable.icon);
- Toast.makeText(this, "Notification cancled", Toast.LENGTH_SHORT).show();
- }
-
- }
都是很简单的例子,帮助理解!