关于android 消息轮询处理

android 中涉及到服务器中数据变化信息通知用户一般有两种 办法,推送和轮询,消息推送是服务端主动发消息给客户端,因为第一时间知道数据变化是服务器自己,所以推送的优势是实时性高,但服务器主动推送需要开发一套能让客户端持久链接的服务器

现在已经有很多开源的代码实现了基于XMMP 协议的推送方案,而且还可以使用谷歌的推送方案,但有些情况并不需要服务端主动推送二是在一定的时间间隔客户端发起查询

private MyThread myThread;

private NotificationManager manager;

private Notification notification;

private PendingIntent pi;

private AsyncHttpClient client;

private boolean flag = true;

@Override

public IBinder onBind(Intent intent) {

// TODO Auto-generated method stub

return null;

}

@Override

public void onCreate() {

System.out.println("oncreate()");

this.client = new AsyncHttpClient();

this.myThread = new MyThread();

this.myThread.start();

super.onCreate();

}

@Override

public void onDestroy() {

this.flag = false;

super.onDestroy();

}

private void notification(String content, String number, String date) {

// 获取系统的通知管理器

manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

notification = new Notification(R.drawable.ic_menu_compose, content,

System.currentTimeMillis());

notification.defaults = Notification.DEFAULT_ALL; // 使用默认设置,比如铃声、震动、闪灯

notification.flags = Notification.FLAG_AUTO_CANCEL; // 但用户点击消息后,消息自动在通知栏自动消失

notification.flags |= Notification.FLAG_NO_CLEAR;// 点击通知栏的删除,消息不会依然不会被删除

Intent intent = new Intent(getApplicationContext(),

ContentActivity.class);

intent.putExtra("content", content);

intent.putExtra("number", number);

intent.putExtra("date", date);

pi = PendingIntent.getActivity(getApplicationContext(), 0, intent, 0);

notification.setLatestEventInfo(getApplicationContext(), number

+ "发来短信", content, pi);

// 将消息推送到状态栏

manager.notify(0, notification);

}

private class MyThread extends Thread {

@Override

public void run() {

String url = "你请求的网络地址";

while (flag) {

System.out.println("发送请求");

try {

// 每个10秒向服务器发送一次请求

Thread.sleep(10000);

} catch (InterruptedException e) {

e.printStackTrace();

}

// 采用get方式向服务器发送请求

client.get(url, new AsyncHttpResponseHandler() {

@Override

public void onSuccess(int statusCode, Header[] headers,

byte[] responseBody) {

try {

JSONObject result = new JSONObject(new String(

responseBody, "utf-8"));

int state = result.getInt("state");

// 假设偶数为未读消息

if (state % 2 == 0) {

String content = result.getString("content");

String date = result.getString("date");

String number = result.getString("number");

notification(content, number, date);

}

} catch (Exception e) {

e.printStackTrace();

}

}

@Override

public void onFailure(int statusCode, Header[] headers,

byte[] responseBody, Throwable error) {

Toast.makeText(getApplicationContext(), "数据请求失败", 0)

.show();

}

});

}

}

}

虽然alarm的意思是闹钟,而且在原生android自带的闹钟应用中AlarmManager也确实非常重要,但并不代表AlarmManager只是用来做闹钟应用的,作为一个一种系统级别的提示服务,肯定应该有着非常重要的地位,实际上android中很多东西都可以利用AlarmManager来实现。

AlarmManager在特定的时刻为我们广播一个指定的Intent。简单的说就是我们设定一个时间,然后在该时间到来时,AlarmManager为我们广播一个我们设定的Intent。这个intent可以指向一个activity,也可以指向一个service。

下面就是使用alarm定时调用service实现轮询的实现方法:

一、新建轮询工具类PollingUtils.java

public class PollingUtils {

//开启轮询服务

public static void startPollingService(Context context, int seconds, Class<?> cls,String action) {

//获取AlarmManager系统服务

AlarmManager manager = (AlarmManager) context

.getSystemService(Context.ALARM_SERVICE);

//包装需要执行Service的Intent

Intent intent = new Intent(context, cls);

intent.setAction(action);

PendingIntent pendingIntent = PendingIntent.getService(context, 0,

intent, PendingIntent.FLAG_UPDATE_CURRENT);

//触发服务的起始时间

long triggerAtTime = SystemClock.elapsedRealtime();

//使用AlarmManger的setRepeating方法设置定期执行的时间间隔(seconds秒)和需要执行的Service

manager.setRepeating(AlarmManager.ELAPSED_REALTIME, triggerAtTime,

seconds * 1000, pendingIntent);

}

//停止轮询服务

public static void stopPollingService(Context context, Class<?> cls,String action) {

AlarmManager manager = (AlarmManager) context

.getSystemService(Context.ALARM_SERVICE);

Intent intent = new Intent(context, cls);

intent.setAction(action);

PendingIntent pendingIntent = PendingIntent.getService(context, 0,

intent, PendingIntent.FLAG_UPDATE_CURRENT);

//取消正在执行的服务

manager.cancel(pendingIntent);

}

}

二、构建轮询任务执行PollingService.java

public class PollingService extends Service {

public static final String ACTION = "com.ryantang.service.PollingService";

private Notification mNotification;

private NotificationManager mManager;

@Override

public IBinder onBind(Intent intent) {

return null;

}

@Override

public void onCreate() {

initNotifiManager();

}

@Override

public void onStart(Intent intent, int startId) {

new PollingThread().start();

}

//初始化通知栏配置

private void initNotifiManager() {

mManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

int icon = R.drawable.ic_launcher;

mNotification = new Notification();

mNotification.icon = icon;

mNotification.tickerText = "New Message";

mNotification.defaults |= Notification.DEFAULT_SOUND;

mNotification.flags = Notification.FLAG_AUTO_CANCEL;

}

//弹出Notification

private void showNotification() {

mNotification.when = System.currentTimeMillis();

//Navigator to the new activity when click the notification title

Intent i = new Intent(this, MessageActivity.class);

PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, i,

Intent.FLAG_ACTIVITY_NEW_TASK);

mNotification.setLatestEventInfo(this,

getResources().getString(R.string.app_name), "You have new message!", pendingIntent);

mManager.notify(0, mNotification);

}

/**

* Polling thread

* 模拟向Server轮询的异步线程

* @Author Ryan

* @Create 2013-7-13 上午10:18:34

*/

int count = 0;

class PollingThread extends Thread {

@Override

public void run() {

System.out.println("Polling...");

count ++;

//当计数能被5整除时弹出通知

if (count % 5 == 0) {

showNotification();

System.out.println("New message!");

}

}

}

@Override

public void onDestroy() {

super.onDestroy();

System.out.println("Service:onDestroy");

}

}

时间: 2024-10-29 04:30:51

关于android 消息轮询处理的相关文章

轮询,长轮询,websocket原理

服务端朝客户端主动推送消息 轮询:效率低,基本不用 让浏览器定时朝后端发送请求(通过ajax向后端偷偷发送数据),比如每隔五秒钟发一次请求,那么你的数据延迟就可能会高达五秒 不足之处 数据延迟 消耗资源过大 请求次数太多 长轮询:兼容性好,一般大公司都会考虑使用它 # 队列+ajax 服务端给每个客户端建立队列,让浏览器通过ajax朝服务端要数据,去各自的队列中获取 如果没有数据则会阻塞但是不会一直阻塞,比如阻塞你30秒,还没有数据则返回,然后让客户端浏览器再次发送请求数据的请求 相对于轮询 基

Android学习系列(7)--App轮询服务器消息

这篇文章是android开发人员的必备知识. 1.轮询服务器     一般的应用,定时通知消息可以采用轮询的方法从服务器拿取消息,当然实时消息通知的话,建议采用推送服务.    其中需要注意轮询的频率设置,要在需求和性能中平衡. 2.独立进程     无论程序是否正在运行,我们都要能通知到客户,我们需要一个独立进程的后台服务.     我们需要一个独立进程的后台服务.     在AndroidManifest.xml中注册Service时,有一个android:process属性,如果这个属性以

Android 轮询最佳实践 Service + AlarmManager+Thread

android中涉及到将服务器中数据变化信息通知用户一般有两种办法,推送和轮询. 消息推送是服务端主动发消息给客户端,因为第一时间知道数据发生变化的是服务器自己,所以推送的优势是实时性高.但服务器主动推送需要单独开发一套能让客户端持久连接的服务端程序,不过现在已经有很多开源的代码实现了基于xmmp协议的推送方案,而且还可以使用谷歌的推送方案.但有些情况下并不需要服务端主动推送,而是在一定的时间间隔内客户端主动发起查询. 譬如有这样一个app,实时性要求不高,每天只要能获取10次最新数据就能满足要

Android 轮询之 Service + AlarmManager+Thread (转)

android中涉及到将服务器中数据变化信息通知用户一般有两种办法,推送和轮询. 消息推送是服务端主动发消息给客户端,因为第一时间知道数据发生变化的是服务器自己,所以推送的优势是实时性高.但服务器主动推送需要单独开发一套能让客户端持久连接的服务端程序,不过现在已经有很多开源的代码实现了基于xmmp协议的推送方案,而且还可以使用谷歌的推送方案.但有些情况下并不需要服务端主动推送,而是在一定的时间间隔内客户端主动发起查询. 譬如有这样一个app,实时性要求不高,每天只要能获取10次最新数据就能满足要

Android AlarmManager实现不间断轮询服务

在消息的获取上是选择 轮询还是推送得根据实际的业务需要来技术选型,例如对消息实时性比较高的需求,比如微博新通知或新闻等那就最好是用推送了.但如果只是一般的消息检测比如 更新检查,可能是半个小时或一个小时一次,那用轮询也是一个不错的选择,因为不需要额外搭建推送服务器,不用额外配置推送服务.另外推送现在一般以维持长 连接的方式实现,在手机客户端也会耗费一定的电量.今天就介绍一个在Android上实现轮询机制的方法——使用AlarmManager AlarmManager 在Android中主要用来定

长轮询实现消息推送

一.应用场景 浏览器与服务器之间保持一个长连接(http链接),服务器有最新的数据生成时及时推送到前端展现.典型场景:新邮件到达通知. 二.业界常用的解决方案 定时轮询,长轮询,websocket(HTML5新增的能力) 其中长轮询兼容性较好,应用的较为广泛,但是切忌在移动网络中应用该技术. 三.长连接前端代码 /** *pns模型层 *@constructs M2012.Model.Pns.PnsModel *@extends Backbone.Model *@example *new M20

Ajax轮询消息自动提示(消息盒子)

经过一下午写了个消息盒子的例子,用的是ajax方式轮询读取,没有用到后台自动“推”数据的方式,效果良好. <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="mainTalk.aspx.cs" Inherits="wj_test.Talk.mainTalk" %> <!DOCTYPE html PUBLIC "-//W3C//DTD X

实现web消息推送的技术和采用长轮询corundumstudio介绍

实时消息的推送,PC端的推送技术可以使用socket建立一个长连接来实现.传统的web服务都是客户端发出请求,服务端给出响应.但是现在直观的要求是允许特定时间内在没有客户端发起请求的情况下服务端主动推送消息到客户端. 有哪些可以实现web消息推送的技术: 不断地轮询(俗称“拉”,polling)是获取实时消息的一个手段:Ajax 隔一段时间(通常使用 JavaScript 的 setTimeout 函数)就去服务器查询是否有改变,从而进行增量式的更新.但是间隔多长时间去查询成了问题,因为性能和即

RabbitMQ消息分发轮询和Message Acknowledgment

一.消息分发 RabbitMQ中的消息都只能存储在Queue中,生产者(下图中的P)生产消息并最终投递到Queue中,消费者(下图中的C)可以从Queue中获取消息并消费. 多个消费者可以订阅同一个Queue,这时Queue中的消息会被平均分摊给多个消费者进行处理,而不是每个消费者都收到所有的消息并处理. 启动3个消费者 生产者依次生成3条消息 可见3条消息分别被3个消费者获取,所以RabbitMQ是采用轮询机制将消息队列Queue中的消息依次发给不同的消费者 二.消息确认(Message Ac