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 */ }
示例源码->百度网盘
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories