您的位置:首页 > 移动开发 > Android开发

Android核心基础-10.通知

2015-09-19 21:59 477 查看

10.通知

10.1.Toast通知

10.1.1.创建、发送通知

Context context = getApplicationContext();
CharSequence text = "Hello toast!";
int duration = Toast.LENGTH_SHORT;

Toast toast = Toast.makeText(context, text, duration);
toast.show();

等价于
Toast.makeText(context, text, duration).show();


10.1.2.设置Toast显示位置

默认是底部水平居中

我们可以使用方法
toast.setGravity(Gravity.TOP|Gravity.LEFT, 0, 0);
来设置

参数一:重力常数;参数二:x轴偏移;参数三:y轴偏移

10.1.3.创建一个自定义Toast

布局文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/toast_layout_root"//注意这里定义的ID
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:padding="8dp"
android:background="#DAAA"
>
<ImageView android:src="@drawable/droid"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="8dp"
/>
<TextView android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#FFF"
/>
</LinearLayout>


代码使用我们自定义的布局

LayoutInflater inflater = getLayoutInflater();
View layout = inflater.inflate(R.layout.custom_toast,
(ViewGroup) findViewById(R.id.toast_layout_root));

TextView text = (TextView) layout.findViewById(R.id.text);
text.setText("This is a custom toast");

Toast toast = new Toast(getApplicationContext());
toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0);
toast.setDuration(Toast.LENGTH_LONG);
toast.setView(layout);
toast.show();


10.2.状态栏通知

一个通知可以提供多种操作。

1.当用户单击该通知时,我们可以打开一个Activity。

2.也可以将按钮添加到通知,可快速回复短信,关闭闹铃等(Android 4.1)。

3.如果你使用其他的动作按钮,你还必须使他们的功能在你的应用程序的活动中,查看更多 Handling compatibility

10.2.1正常视图的状态栏通知



高度:64dp

参数说明:

The callouts in the illustration refer to the following:

1.Content title(内容标题)

2.Large icon(大图标)

3.Content text(内容文本)

4.Content info(内容信息)

5.Small icon(小图标)

6.Time that the notification was issued. You can set an explicit value with setWhen(); if you don’t it defaults to the time that the system received the notification.(发出通知的时间。你可以用setwhen()显式值集;如果你不违约的时候,系统收到通知。)

10.2.2.大视图的状态栏通知



Android 4.1.抽屉被拉开时显示。

注意,大部分的视觉元素与正常的视图共享。唯一不同的是标注7号,正文区。每一个大的视图样式都以不同的方式设置该区域。可用的风格是:

大图片样式

正文区域包含一个位图多达256个dp在正文部分高。

大文本风格

在正文部分显示一个大文本块。

收件箱样式

在正文部分显示文本行。

所有的大视图样式也有以下内容选项,在正常视图中不可用:

大标题

允许您重写“正常”视图的内容标题,标题仅以“扩展视图”出现。

摘要文本

允许您在正文区域添加一行文本。

将大的视图样式应用到通知中描述的“大”视图样式中的“通知”。

10.2.3.创建状态栏通知

一个通知对象必须包含以下部分:

一个小图标,通过setSmallIcon()设置

一个标题,由setContentTitle()设置

详细的文本,由setContentText()设置

其他部分都是可选的。

创建一个普通视图

NotificationCompat.Builder mBuilder =
new NotificationCompat.Builder(this)
.setSmallIcon(R.drawable.notification_icon)
.setContentTitle("My notification")
.setContentText("Hello World!");
// 创建一个明确的意图,链接至我们应用程序的Acitivity
Intent resultIntent = new Intent(this, ResultActivity.class);

// 创建一个堆栈生成器
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
//为意图添加回栈(但不是意图本身)
stackBuilder.addParentStack(ResultActivity.class);
// 将启动活动的意图添加到堆栈的顶部
stackBuilder.addNextIntent(resultIntent);
PendingIntent resultPendingIntent =
stackBuilder.getPendingIntent(
0,
PendingIntent.FLAG_UPDATE_CURRENT
);
mBuilder.setContentIntent(resultPendingIntent);
// 获取通知管理器
NotificationManager mNotificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
// 用管理器发送通知
mNotificationManager.notify(mId, mBuilder.build());


创建一个大视图通知

NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this)
.setSmallIcon(R.drawable.notification_icon)
.setContentTitle("Event tracker")
.setContentText("Events received");
NotificationCompat.InboxStyle inboxStyle =
new NotificationCompat.InboxStyle();
String[] events = new String[6];
// 设置“收件箱”式的“大”视图的标题
inboxStyle.setBigContentTitle("Event tracker details:");
...
// 将事件移动到大视图
for (int i=0; i < events.length; i++) {
inboxStyle.addLine(events[i]);
}
// 将大视图样式对象移动到通知对象中。
mBuilder.setStyle(inBoxStyle);
...
// 发出通知。


更新通知

mNotificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
// 给通知设置一个ID
int notifyID = 1;
mNotifyBuilder = new NotificationCompat.Builder(this)
.setContentTitle("New Message")
.setContentText("You've received new messages.")
.setSmallIcon(R.drawable.ic_notify_status)
numMessages = 0;
// 开启一个loop去处理数据,并更新通知。
...
mNotifyBuilder.setContentText(currentText)
.setNumber(++numMessages);
// 因为持有唯一通知ID,通知将得到更新
mNotificationManager.notify(
notifyID,
mNotifyBuilder.build());
...


移除通知

1.用户下拉通知栏点击清除

2.setAutoCancel()后,用户点击该条通知后,则该条通知消失。

3.cancel()指定ID的通知

4.cancelAll()清除全部通知

10.2.4.点击通知栏的一条消息启动Activity

创建正常PendingIntent意图

1.清单文件中

<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".ResultActivity"
android:parentActivityName=".MainActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".MainActivity"/>
</activity>


代码中

...
Intent resultIntent = new Intent(this, ResultActivity.class);
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
// 添加一个父类(当点击通知弹出一个Activity,我们此时再按返回键要回到的Activity界面)
stackBuilder.addParentStack(ResultActivity.class);
// 添加一个意图到栈顶
stackBuilder.addNextIntent(resultIntent);
// 获得一个PendingIntent
PendingIntent resultPendingIntent =
stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
...
NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
builder.setContentIntent(resultPendingIntent);
NotificationManager mNotificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.notify(id, builder.build());


创建特定PendingIntent意图

清单文件中

<activity
android:name=".ResultActivity"
...
android:launchMode="singleTask"
android:taskAffinity=""
android:excludeFromRecents="true">
</activity>
...


代码中

// 创建一个通知生成器
NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
// 创建一个意图
Intent notifyIntent =
new Intent(new ComponentName(this, ResultActivity.class));
// 设置意图启动在一个新的,空的堆栈中
notifyIntent.setFlags(FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TASK);
// 创建一个PendingIntent
PendingIntent notifyIntent =
PendingIntent.getActivity(
this,
0,
notifyIntent
PendingIntent.FLAG_UPDATE_CURRENT
);

// 将PendingIntent绑定到通知中
builder.setContentIntent(notifyIntent);
// 创建一个通知管理器
NotificationManager mNotificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
// 用管理器发送通知
mNotificationManager.notify(id, builder.build());


创建通知

通过构造函数创建: Notification(int icon, CharSequence tickerText, long when)

icon: 通知的图片资源ID

tickerText: 状态栏中显示的消息内容

when: 时间

创建PendingIntent以供点击时发送

PendingIntent.getActivity(Context context, int requestCode, Intent intent, int flags)

context: 当前上下文

requestCode: 请求码

intent: 点击时要发送的意图

flags: 类型, PendingIntent中提供了常量选择

设置通知点击事件

调用Notification 对象方法: setLatestEventInfo(Context context, CharSequence contentTitle, CharSequence contentText, PendingIntent contentIntent)

context: 当前上下文

contentTitle: 标题

contentText: 内容

contentIntent: 点击时触发的意图

设置通知点击后清除

设置Notification 对象属性 n.flags = Notification.FLAG_AUTO_CANCEL;

获取系统通知服务

NotificationManager nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE)

发送消息

调用Notification对象方法: notify(int id, Notification notification)

具体代码

Notification n = new Notification(R.drawable.qq, "下载完成", System.currentTimeMillis());
PendingIntent pi = PendingIntent.getActivity(this, 100,  new Intent(this, ResultActivity.class), PendingIntent.FLAG_ONE_SHOT);
n.setLatestEventInfo(this, "下载完成", "qq.exe下载完成", pi);
n.flags = Notification.FLAG_AUTO_CANCEL;
NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);


10.2.4.在通知中显示进度

显示固定持续时间进度指示器

...
mNotifyManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
mBuilder = new NotificationCompat.Builder(this);
mBuilder.setContentTitle("Picture Download")
.setContentText("Download in progress")
.setSmallIcon(R.drawable.ic_notification);
// 在新线程中开启一个耗时操作
new Thread(
new Runnable() {
@Override
public void run() {
int incr;
// 这个耗时操作执行20次
for (incr = 0; incr <= 100; incr+=5) {
// 设置完成进度条的值
mBuilder.setProgress(100, incr, false);
// 第一次显示进度条
mNotifyManager.notify(0, mBuilder.build());
// 开启睡眠,模拟耗时操作
try {
// Sleep for 5 seconds
Thread.sleep(5*1000);
} catch (InterruptedException e) {
Log.d(TAG, "sleep failure");
}
}
// 当循环结束时,更新通知
mBuilder.setContentText("Download complete")
// 移除进度条
.setProgress(0,0,false);
mNotifyManager.notify(ID, mBuilder.build());
}
}
).start();


10.3.普通对话框



public void normal(View v) {
OnClickListener listener = new OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
switch (which) { // 判断选了哪个按钮
case DialogInterface.BUTTON_POSITIVE: // 右边的
Toast.makeText(getApplicationContext(), "确定", Toast.LENGTH_SHORT).show();
break;
case DialogInterface.BUTTON_NEUTRAL: // 中间的
Toast.makeText(getApplicationContext(), "稍后", Toast.LENGTH_SHORT).show();
break;
case DialogInterface.BUTTON_NEGATIVE: // 左边的
Toast.makeText(getApplicationContext(), "取消", Toast.LENGTH_SHORT).show();
break;
}
}
};

new AlertDialog.Builder(this) // 下面方法返回值都是Builder, 可以连续调用
.setTitle("是否下载更新?") // 标题
.setMessage("1.速度更快\r\n2.更多功能\r\n3.修复上个版本的Bug") // 具体消息
.setCancelable(false) // 是否可取消
.setPositiveButton("确定", listener) // 右边按钮
.setNeutralButton("稍后", listener) // 中间按钮
.setNegativeButton("取消", listener) // 左边按钮
.show(); // 显示
}


10.4.单选对话框



public void single(View v) {
final String[] items = { "Java", ".Net", "PHP", "网页平面设计", "iOS", "C++" };

OnClickListener listener = new OnClickListener() {
private int index;

public void onClick(DialogInterface dialog, int which) {
switch (which) {
case DialogInterface.BUTTON_POSITIVE:
Toast.makeText(getApplicationContext(), items[index], Toast.LENGTH_SHORT).show();
break;
default:
index = which;
}
}
};

new AlertDialog.Builder(this).setTitle("选择要学习的课程").setSingleChoiceItems(items, -1, listener) // 设置数据, 默认选项, 监听器
.setPositiveButton("确定", listener).show();
}


10.5.多选对话框



public void multi(View v) {
final String[] items = { "抽烟", "喝酒", "烫头" };
final boolean[] checkedItems = { false, false, false };

OnMultiChoiceClickListener multiListener = new OnMultiChoiceClickListener() {
public void onClick(DialogInterface dialog, int which, boolean isChecked) {
System.out.println(items[which] + ": " + isChecked);
}
};

OnClickListener positiveListener = new OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < checkedItems.length; i++) {
sb.append(checkedItems[i] ? items[i] + " " : "");
}
Toast.makeText(getApplicationContext(), sb, Toast.LENGTH_SHORT).show();
}
};

new AlertDialog.Builder(this).setTitle("请选择您的爱好").setMultiChoiceItems(items, checkedItems, multiListener).setPositiveButton("确定", positiveListener).show();
}


10.6.进度对话框



public void progress(View v) {
final ProgressDialog dialog = new ProgressDialog(this);
dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
dialog.setTitle("正在下载, 请稍候...");
dialog.show();
dialog.setMax(100); // 最大刻度

new Thread() {
public void run() {
for (int i = 1; i <= 100; i++) {
dialog.setProgress(i); // 设置进度(可以在新线程中修改界面)
SystemClock.sleep(100);
}
dialog.dismiss(); // 销毁
}
}.start();

/*
* 带进度条的界面都可以在新线程中操作. 只要使用进度条, 一定是耗时操作. 耗时操作一定是在新线程中的. 进度条通常都是在新线程中使用
* 安卓已经替我们做了Handler的操作
*
* ProgressBar, SeekBar
*/
}


示例源码->百度网盘
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android 通知 对话框