notification是一种出现在状态栏的提示,效果如下:单击send 按钮,状态栏出现消息通知图标;下拉状态栏,出现消息内容;点击消息内容时,返回 MainActivty。
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"