使用 Notification 在状态栏中显示一个通知。
2015-11-27 11:25
513 查看
notification是一种出现在状态栏的提示,效果如下:单击send 按钮,状态栏出现消息通知图标;下拉状态栏,出现消息内容;点击消息内容时,返回 MainActivty。
layout_main.xml 布局文件
item.xml 布局文件:
由于消息提示默认为白色,与字体颜色相冲突,所以,修改背景颜色(此处为黑色)
MainActivity :
PendingIntent 包装的 Intent 每次都要 new 出来,增加了内存的消耗,可以采用 singleTop 模式(当将要启动的目标 Activity 已经位于 Task 栈顶时,系统不会重新创建目标 Activity 的实例,而是直接复用已有的 Activity 实例):
layout_main.xml 布局文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" android:gravity="center_horizontal" tools:context="com.android.notificationtest.MainActivity" > <Button android:id="@+id/send" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="send"/> <Button android:id="@+id/cancel" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="cancel"/> </LinearLayout>
item.xml 布局文件:
由于消息提示默认为白色,与字体颜色相冲突,所以,修改背景颜色(此处为黑色)
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@android:color/black" android:orientation="horizontal" > <ImageView android:id="@+id/imageView" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <LinearLayout android:orientation="vertical" android:layout_width="wrap_content" android:layout_height="wrap_content"> <TextView android:id="@+id/title" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <TextView android:id="@+id/text" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </LinearLayout> </LinearLayout>
MainActivity :
package com.android.notificationtest; import android.app.Activity; import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; import android.content.Intent; import android.os.Bundle; import android.support.v4.app.NotificationCompat; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.RemoteViews; public class MainActivity extends Activity { private static final int NOTIFICATION_ID = 0X123; private NotificationManager manager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button send = (Button)findViewById(R.id.send); Button cancel = (Button)findViewById(R.id.cancel); manager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE); send.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { addMessage(); } }); cancel.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { cancelMessage(); } }); } /** * 增加消息 */ protected void addMessage() { // 创建一个 NotificationCompat 类 // Builder class for NotificationCompat objects NotificationCompat.Builder mBuilder = new NotificationCompat.Builder( this); mBuilder.setSmallIcon(R.drawable.sha); // 系统默认的和自定义的都不能少 // 系统默认的 // mBuilder.setContentTitle("你有一条消息:"); // 系统默认的 // mBuilder.setContentText("你的消息内容为......"); // 结合所有已设置的选项返回一个新的 Notification(通知) 对象 Notification notification = mBuilder.build(); // 自定义(开始) // 通过指定的布局文件新建一个RemoteViews对象。 //(RemoteViews一个描述了可以在其他进程中显示的view层) RemoteViews remoteViews = new RemoteViews(getPackageName(), R.layout.item); remoteViews.setImageViewResource(R.id.imageView, R.drawable.zhu); remoteViews.setTextViewText(R.id.title, "标题的题目......"); remoteViews.setTextViewText(R.id.text, "内容是什么......"); notification.contentView = remoteViews; // 自定义结束 // 通知消息: 声音 + 振动 notification.defaults = Notification.DEFAULT_SOUND | Notification.DEFAULT_VIBRATE; // 通知时间 notification.when = System.currentTimeMillis(); // 当用户点击通知栏的Notification时候,切换回MainActivity。 // PendingIntent 通常会传给其他的应用组件,从而由其他应用程序来执行 PendingIntent 所包装的"Intent" Intent intent = new Intent(this, MainActivity.class); PendingIntent pi = PendingIntent.getActivity(this, 0, intent, 0); notification.contentIntent = pi; // 在状态栏中显示一个通知。 manager.notify(NOTIFICATION_ID, notification); } /** * 删除消息 */ protected void cancelMessage() { manager.cancel(NOTIFICATION_ID); } }
PendingIntent 包装的 Intent 每次都要 new 出来,增加了内存的消耗,可以采用 singleTop 模式(当将要启动的目标 Activity 已经位于 Task 栈顶时,系统不会重新创建目标 Activity 的实例,而是直接复用已有的 Activity 实例):
android:launchMode="singleTop"
相关文章推荐
- Spring中depends-on的作用是什么?
- oracle 权限管理
- unix时间通过mysql转换出来
- css 样式(checkbox开关、css按钮)
- JavaScript SetInterval与setTimeout的区别
- python爬虫——爬取知乎上自己关注的问题
- android颜色表
- 进程间通信
- 支持向量机SVM(二)
- 用心做点事,写点代码的哲学
- 总结一下使用Emgucv的经验和经历
- 分享
- 对Office文档进行授权
- 总结一下使用Emgucv的经验和经历
- 《利用python进行数据分析》读书笔记--第四章 numpy基础:数组和矢量计算
- Linux编程中 #define _XOPEN_SOURCE的作用
- [置顶] 记录一下融云即时通讯IM
- 创建WordPress Docker镜像
- java连接oracle数据库,自己封装的几个方法
- vision 2013画图 解决交叉箭头自动弯曲问题