android实现通知栏消息
一、原理
消息推送有两种,一种是客户端定时直接到服务器搜索消息,如果发现有新的消息,就获取消息下来;另一种是服务器向客户端发送消息,也就是当有信息消息时,服务器端就会向客户端发送消息。
二、步骤(代码)
注: Notification //是具体状态栏对象,设置Icon、文字、声音等。
NotificationMangager //状态栏通知管理类、负责发消息、清理消息。
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.IBinder;
import android.provider.MediaStore.Audio;
import android.util.Log;
import android.widget.RemoteViews;
/**
* 消息推送
*
* @author Msquirrel
*
*/
public class MessageService extends Service {
private String TAG = "-----------";
private MessageThread messageThread = null;
// 点击查看
private Intent messageIntent = null;
private PendingIntent messagePendingIntent = null;
// 通知栏消息
private int messageNotificationID = 1000;
private Notification messageNotification = null; // 是具体的状态栏通知对象,可以设置icon、文字、提示声音、振动等等参数。
private NotificationManager messageNotificatioManager = null; // 是状态栏通知的管理类,负责发通知、清楚通知等。
private RemoteViews contentView = null;
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// 初始化
// messageNotification = new
// Notification(R.drawable.icon,"新消息11",System.currentTimeMillis());//*简单消息版本里的*此版本不使用
messageNotification = new Notification();
messageNotification.icon = R.drawable.icon;// 状态栏提示图标
messageNotification.tickerText = "嘿嘿,测试消息推送";// 状态栏提示消息
contentView = new RemoteViews(getPackageName(), R.layout.view);// 消息内容容器
contentView.setImageViewResource(R.id.image, R.drawable.icon);// 消息容器界面的图标
messageNotification.contentView = contentView;// 把消息容器和消息绑定
// messageNotification.icon = R.drawable.icon;//*简单消息版本里的*此版本不使用
// messageNotification.tickerText = "新消息11";//*简单消息版本里的*此版本不使用
// messageNotification.when=System.currentTimeMillis();
// //*简单消息版本里的*此版本不使用
// messageNotification.defaults |= Notification.DEFAULT_SOUND;//声音
// messageNotification.defaults |= Notification.DEFAULT_LIGHTS;//灯
// messageNotification.defaults |= Notification.DEFAULT_VIBRATE;//震动
// messageNotification.sound = Uri.parse("file:///sdcard/to.mp3");
messageNotification.sound = Uri.withAppendedPath(
Audio.Media.INTERNAL_CONTENT_URI, "2");// 选音乐清单的第2首歌做消息声音
// messageNotification.ledARGB = 0xff00ff00;//灯的颜色
// messageNotification.ledOnMS = 300; //亮的时间
// messageNotification.ledOffMS = 1000; //灭的时间
// messageNotification.flags |= Notification.FLAG_SHOW_LIGHTS;//显示灯
// long v[]= {0,100,200,300}; //震动频率
// messageNotification.vibrate = v;
//
messageNotification.flags |= Notification.FLAG_AUTO_CANCEL;// 点击消息后,该消息自动退出
messageNotification.flags |= Notification.FLAG_ONGOING_EVENT;// 在上方运行消息栏中出现
// messageNotification.flags|=Notification.FLAG_NO_CLEAR;//此消息不会被清除
messageNotificatioManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
messageIntent = new Intent(this, ShowMessage .class);// 点击消息后,要跳转的界面 ( 对应 详细消息的界面 )
// 开启线程
messageThread = new MessageThread();// 该线程每10秒,发布一条消息出来
messageThread.isRunning = true;// 设置为false后,线程跳出循环并结束对
messageThread.start();
Log.i(TAG, "startCommand");
return super.onStartCommand(intent, flags, startId);
}
/**
* 从服务器端获取消息
*/
class MessageThread extends Thread {
// 设置为false后,线程跳出循环并结束
public boolean isRunning = true;
public void run() {
while (isRunning) {
try {
String serverMessage = getServerMessage();
if (serverMessage != null && !"".equals(serverMessage)) {
// 更新通知栏
// messageNotification.setLatestEventInfo(MessageService.this,"新消息","哇~有 新消息耶!"+serverMessage,messagePendingIntent);//*简单消息版本里的*此版本不使用
contentView.setTextViewText(R.id.text, serverMessage);// 设置消息内容
messageIntent.putExtra("message", serverMessage);// 为意图添加参数
messagePendingIntent = PendingIntent.getActivity(
MessageService.this, 0, messageIntent,
PendingIntent.FLAG_CANCEL_CURRENT);// 将意图装入 延迟意图
messageNotification.contentIntent = messagePendingIntent;// 将延迟意图装入消息
messageNotificatioManager.notify(messageNotificationID,
messageNotification);// 启动Notification
Log.i(TAG, "发出消息");
// messageNotificatioManager.cancel(messageNotificationID-1);//新消息来后,消除之前的一条消息(只显示最新消息)
// 配置好下条消息的id号
messageNotificationID++;
}
// 休息10秒钟
Thread.sleep(10000);
// 获取服务器消息
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
/**
* 模仿服务器发送过来的消息,仅作示例
*
* @return 返回服务器要推送的消息,否则如果为空的话,不推送
*/
public String getServerMessage() {
Log.i(TAG, "getmessage");
return "亲, 测试成功啦~~!";
}
@Override
public void onDestroy() {
// System.exit(0);
messageThread.isRunning = false;
// 或者,二选一,推荐使用System.exit(0),这样进程退出的更干净
// messageThread.isRunning = false;
super.onDestroy();
Log.i(TAG, "destroy");
}
}
android实现通知栏消息的更多相关文章
- React Native之通知栏消息提示(android)
React Native之通知栏消息提示(android) 一,需求分析与概述 1.1,推送作为手机应用的基本功能,是手机应用的重要部分,如果自己实现一套推送系统费时费力,所以大部分的应用都会选择使用 ...
- Android监听消息通知栏点击事件
Android监听消息通知栏点击事件 使用BroadCastReceiver 1 新建一个NotificationClickReceiver 类,并且在清单文件中注册!! public class N ...
- Android:通知栏的使用
非常久没有使用Android的通知功能了,今天把两年前的代码搬出来一看.发现非常多方法都废弃了,代码中各种删除线看的十分不爽.于是乎,打开Google,查看官方文档.学习最新的发送通知栏消息的方法. ...
- React Native之通知栏消息提示(ios)
React Native之通知栏消息提示(ios) 一,需求分析与概述 详情请查看:React Native之通知栏消息提示(android) 二,极光推送注册与集成 2.1,注册 详情请查看:Rea ...
- 浅析Android中的消息机制(转)
原博客地址:http://blog.csdn.net/liuhe688/article/details/6407225 在分析Android消息机制之前,我们先来看一段代码: public class ...
- Android核心分析 之十一Android GWES之消息系统
Android GWES之Android消息系统 ...
- 浅析Android中的消息机制(转)
在分析Android消息机制之前,我们先来看一段代码: public class MainActivity extends Activity implements View.OnClickListen ...
- 浅析Android中的消息机制-解决:Only the original thread that created a view hierarchy can touch its views.
在分析Android消息机制之前,我们先来看一段代码: public class MainActivity extends Activity implements View.OnClickListen ...
- 浅析Android中的消息机制
在分析Android消息机制之前,我们先来看一段代码: public class MainActivity extends Activity implements View.OnClickListen ...
随机推荐
- 47.Number of Islands(岛的数量)
Level: Medium 题目描述: Given a 2d grid map of '1's (land) and '0's (water), count the number of islan ...
- Python 字典dict 集合set
字典dict Python内置字典,通过key-value进行存储,字典是无序的,拓展hash names = ['Michael', 'Bob', 'Tracy'] scores = [95, 75 ...
- 科普NDIS封包过滤
闲言: 这个月一直在学习NDIS驱动编程,杂七杂八的资料都看个遍了,做了点笔记,捋捋思路,发上来备忘. Ps:只是小菜的一点学习笔记,没什么技术含量,不过版主如果觉得对大家稍微有点帮助的话 ...
- 用java Graphics生成验证码
以下下是API文档对Graphics的介绍! Graphics 类是所有图形上下文的抽象基类,允许应用程序在组件(已经在各种设备上实现)以及闭屏图像上进行绘制. Graphics 对象封装了 Java ...
- 【HIHOCODER 1067】最近公共祖先·二(LCA)
描述 上上回说到,小Hi和小Ho用非常拙劣--或者说粗糙的手段山寨出了一个神奇的网站,这个网站可以计算出某两个人的所有共同祖先中辈分最低的一个是谁.远在美国的他们利用了一些奇妙的技术获得了国内许多人的 ...
- 常见slave 延迟原因以及解决方法
一 序言在运维线上M-M 架构的MySQL数据库时,接收的比较多关于主备延时的报警: 点击(此处)折叠或打开 check_ins_slave_lag (err_cnt:1)critical-slav ...
- 【转】VS2017的VSIX插件开发
最近从头开发了一遍一个VSIX的插件,用于调测的一个工具: 特此把相关的过程经验记录下来: 第一步:建立工程 1. 首先是安装上: 需要安装Visual Studio SDK,这个在安装VS ...
- Cocoa-Cocoa对象
2.Cocoa对象 2.1 Objective-C是面向对象的语言 Objective-C和Java C++一样,有封装,继承,多态,重用.但是它不像C++那样有重载操作法.模版和多继承,也没有Jav ...
- Leetcode 373.查找和最小的k对数字
查找和最小的k对数字 给定两个以升序排列的整形数组 nums1 和 nums2, 以及一个整数 k. 定义一对值 (u,v),其中第一个元素来自 nums1,第二个元素来自 nums2. 找到和最小的 ...
- hdu2024
这题目感觉不是很严谨,如果是关键字的话也是不能作为合法标识符的,但是这个不用检测,就算要检测也会很费劲,还得用字符串匹配,而且还得知道一共都有哪些关键字,太麻烦了,所以出题人原意就是检查大小写字母数字 ...