android通过服务实现消息推送
这里运用到的andorid知识模块主要有Notification和Service,和一个android-async-http-master开源框架
android项目中,有时会有这样一种需求:客户每隔一段时间,就像服务器发送一个请求,以获取某些重要的、实时更新的消息。比如天气预报。
如何让应用实现在后台一直处于运行状态,并且每个一段时间就向服务器发一个请求?android里的四大组件之一:服务,就为我们提供了这种功能。
因此,我们可以尝试在服务里边定义一个线程,只要服务不停止,线程就一直在运行,让它每隔一段时间,就向服务器发送一个请求。
我们来看一下核心代码
1.在Activity中,我们可以通过startService()来启动服务
public void open(View view) {
Intent intent = new Intent(this, PushSmsService.class);
// 启动服务
startService(intent);
}
2.这是我们需要自定义一个服务类,去继承android的Service类
/**
*
* 短信推送服务类,在后台长期运行,每个一段时间就向服务器发送一次请求
*
* @author jerry
*
*/
public class PushSmsService extends Service {
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 = "http://110.65.99.66:8080/jerry/PushSmsServlet";
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();
}
}); }
}
} }
注意我们要在清单文件中注册Service
<service android:name=".PushSmsService"></service>
由于通知信息使用到了手机的震动功能和网络访问,所以需要配置权限
<uses-permission android:name="android.permission.VIBRATE"/>
<uses-permission android:name="android.permission.INTERNET"/>
我们在定义一个Activity,用于用户点击下拉通知栏里的某条消息后,跳转到详细的消息界面
public class ContentActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_content);
Intent intent = getIntent();
TextView tv_content = (TextView) this.findViewById(R.id.tv_content);
TextView tv_number = (TextView) this.findViewById(R.id.tv_number);
TextView tv_date = (TextView) this.findViewById(R.id.tv_date);
if (intent != null) {
String content = intent.getStringExtra("content");
String number = intent.getStringExtra("number");
String date = intent.getStringExtra("date");
tv_content.setText("内容:" + content);
tv_number.setText("号码:" + number);
tv_date.setText("日期:" + date);
}
}
}
同样,我们需要在清单文件中注册新的Activity
<activity android:name=".ContentActivity"></activity>
主要到上边的代码是需要服务器提供支持的,我们去新建一个简单的服务器,里边添加一个Servlet就可以了
public class PushSmsServlet extends HttpServlet {
private static int index = 1;
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println(index);
// List<Sms> smsList = new ArrayList<Sms>();
Sms sms = new Sms(index,
"我爱你我爱你我爱你我爱你我爱你我爱你我爱你我爱你我爱你我爱你我爱你我爱你" + index, "2013-03-03",
"13522224444");
index++;
// smsList.add(sms);
// sms = new Sms(0, "我真的爱你", "2013-04-04", "13522224444");
// smsList.add(sms);
// sms = new Sms(1, "我真的真的爱你", "2013-05-05", "13522224444");
// smsList.add(sms);
response.setContentType("text/html");
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("utf-8");
PrintWriter out = response.getWriter();
Gson gson = new Gson();
// 将Sms类的数据转换为json数据格式
String json = gson.toJson(sms);
out.write(json);
out.flush();
out.close();
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doGet(request, response);
}
}
在定义封装用于存放消息的类
public class Sms {
private int state;
private String content;
private String date;
private String number;
public Sms(int state, String content, String date, String number) {
super();
this.state = state;
this.content = content;
this.date = date;
this.number = number;
}
}
这里只贴出核心代码
android通过服务实现消息推送的更多相关文章
- Android 基于Netty的消息推送方案之对象的传递(四)
在上一篇文章中<Android 基于Netty的消息推送方案之字符串的接收和发送(三)>我们介绍了Netty的字符串传递,我们知道了Netty的消息传递都是基于流,通过ChannelBuf ...
- Android 基于Netty的消息推送方案之字符串的接收和发送(三)
在上一篇文章中<Android 基于Netty的消息推送方案之概念和工作原理(二)> ,我们介绍过一些关于Netty的概念和工作原理的内容,今天我们先来介绍一个叫做ChannelBuffe ...
- Asp.net SignalR 实现服务端消息推送到Web端
之前的文章介绍过Asp.net SignalR, ASP .NET SignalR是一个ASP .NET 下的类库,可以在ASP .NET 的Web项目中实现实时通信. 今天我 ...
- Android 基于Netty的消息推送方案之概念和工作原理(二)
上一篇文章中我讲述了关于消息推送的方案以及一个基于Netty实现的一个简单的Hello World,为了更好的理解Hello World中的代码,今天我来讲解一下关于Netty中一些概念和工作原理的内 ...
- Android 基于Netty的消息推送方案之Hello World(一)
消息推送方案(轮询.长连接) 轮询 轮询:比较简单的,最容易理解和实现的就是客户端去服务器上拉信息,信息的及时性要求越高则拉信息的频率越高.客户端拉信息的触发可以是一些事件,也可以是一个定时器,不断地 ...
- 使用SignalR实现服务端消息推送
概述 这篇文章参考的是Server Broadcast with SignalR 2这篇教程,很不错的一篇教程,如果有兴趣的话可以查看原文,今天记录下来作为一个学习笔记,这样今后翻阅会更方便一点. 这 ...
- Spring mvc服务端消息推送(SSE技术)
SSE技术是基于单工通信模式,只是单纯的客户端向服务端发送请求,服务端不会主动发送给客户端.服务端采取的策略是抓住这个请求不放,等数据更新的时候才返回给客户端,当客户端接收到消息后,再向服务端发送请求 ...
- android基于XMPP的消息推送机制
关于服务器端向Android客户端的推送,主要有三种方式:1.客户端定时去服务端取或者保持一个长Socket,从本质讲这个不叫推送,这是去服务端拽数据.但是实现简单,主要缺点:耗电等2.Google的 ...
- Android P正式版即将到来:后台应用保活、消息推送的真正噩梦
1.前言 对于广大Android开发者来说,Android O(即Android 8.0)还没玩热,Andriod P(即Andriod 9.0)又要来了. 下图上谷歌官方公布的Android P ...
随机推荐
- Break the Chocolate(规律)
Break the Chocolate Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- BFG
"/"应用程序中的服务器错误. 配置错误 说明: 在处理向该请求提供服务所需的配置文件时出错.请检查下面的特定错误详细信息并适当地修改配置文件. 分析器错误消息: 提供程序集合中不 ...
- 【转】How to Start Intel Hardware-assisted Virtualization (hypervisor) on Linux to Speed-up Intel Android x86 Emulator
[转]How to Start Intel Hardware-assisted Virtualization (hypervisor) on Linux to Speed-up Intel Andro ...
- UVa---------10935(Throwing cards away I)
题目: Problem B: Throwing cards away I Given is an ordered deck of n cards numbered 1 to n with card 1 ...
- JQuery隔行变色
<html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> &l ...
- 安装duetdisplay遇到的问题
1.报错failed to correctly acquire vcredist_x64.exe ifle:CRC error 已经确认了 和墙有关系,通过FQ可以正常安装了. 2.在PAD屏幕上面播 ...
- nfs:server is not responding,still trying 原因与解决
方案(学自他人) nfs:server is not responding,still trying的解决方法 (2009-04-20 10:20) 方法1 : 我在arm上通过NFS共享文件时出现下 ...
- Objective-C基础教程读书笔记(6)
第6章 源文件组织 到目前为止,我们讨论过的所有项目都是把源代码统统放入main.m文件中.类的main()函数,@interface和@implementation部分都被塞入同一个文件里.这种结构 ...
- SqlServer和Oracle中一些常用的sql语句10 特殊应用
--482, ORACLE / SQL SERVER --订购数量超过平均值的书籍 WITH Orders_Book AS ( SELECT Book_Name, SUM(Qty) Book_Qty ...
- POJ 1410 Intersection(线段相交&&推断点在矩形内&&坑爹)
Intersection 大意:给你一条线段,给你一个矩形,问是否相交. 相交:线段全然在矩形内部算相交:线段与矩形随意一条边不规范相交算相交. 思路:知道详细的相交规则之后题事实上是不难的,可是还有 ...