android 用signalr 实现推送服务

我做的app需要实现signalr 推送服务

有两种方法

一种人家已经给我们集成了还有视频教程

地址为 https://www.youtube.com/watch?v=f9ih_M7PC10  下载的程序在这 按照视频做,但是更新了我没成功完成 https://www.youtube.com/watch?v=f9ih_M7PC10

第二种自己集成

一共分两步

第一步我是在activity 里面实现接收服务器推送的数据

首先 google上面下载 java-client 地址 https://github.com/SignalR/java-client

再下载 basic-http-client-android-0.88.jar 
地址 basic-http-client-android-0.88.jar

这两个是准备工作,下面就是 生成自己需要的包jar

1.Open Android Studio, click "Import Non-Android Studio Project" and select the cloned directory

Build the project.

The signalr-client-sdk.jar will be generated inside the /signalr-client-sdk/build/libs folder

The signalr-client-sdk-android.aar will be generated inside the /signalr-client-sdk-android/build/outputs/aar folder

2.这里用eclipse的只有jar有用了,aar得自己重新做了,这里我讲一下怎么做的

解压aar 去除布局部分重新打包.jar     Rename *.aar to *.zip and extract the jar.意思是先重新命名aar为zip解压提取里面的jar

3。视频中打包的longPolling。jar 我这边不一样所以打包不起来,选择把用到的所有类全部加在一个包中 其实就相当于解压打包的。当然eclipse里面后期你可以重新打包了用。

4.编程阶段 在activity里面调用很简单的

public class SignalrActivity extends Activity {

private ImageButton goback;

private TextView what;

private IHubProxy hub = null;

private HubConnection conn = null;

// private final static String

// HUB_URL="http://192.168.1.200:82/signalr/hubs";

@Override

protected void onCreate(Bundle savedInstanceState) {

// TODO Auto-generated method stub

super.onCreate(savedInstanceState);

setContentView(R.layout.signalr_layout);

goback = (ImageButton) findViewById(R.id.goback);

goback.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View arg0) {

// TODO Auto-generated method stub

SignalrActivity.this.finish();

}

});

what = (TextView) findViewById(R.id.what);

conn = new HubConnection(Icons.HUB_URL, this,

new LongPollingTransport()) {

@Override

public void OnError(Exception exception) {

}

@Override

public void OnMessage(String message) {

what.setText(message);

}

@Override

public void OnStateChanged(StateBase oldState, StateBase newState) {

}

};

conn.getHeaders().put("Cookie",

"BearerToken=" + SharedPref.getToken(getApplicationContext()));

beginConnect();

}

private void beginConnect() {

// TODO Auto-generated method stub

try {

hub = conn.CreateHubProxy("clientHub");

} catch (OperationApplicationException e) {

e.printStackTrace();

}

hub.On("debug1", new HubOnDataCallback() {//addNewMessageToPage

@Override

public void OnReceived(JSONArray args) {

for (int i = 0; i < args.length(); i++) {

Toast.makeText(getApplicationContext(), "chen"+args, Toast.LENGTH_SHORT

).show();

}

}

});

conn.Start();

}

}

这里就可以看到推送的消息了。

第二步在你不运行程序的时候实现通知栏通知推送的消息

那就是得自己先写一个服务了其实很简单,就是相当于把activity改成service

public class SignalrPushService extends Service {

private String message;

private boolean quit;

private MyBinder binder = new MyBinder();

private IHubProxy hub = null;

private HubConnection conn = null;

// 通知栏消息 数量

private int messageNotificationID = 0;

@SuppressLint("HandlerLeak")

private Handler handler = new Handler() {

@SuppressWarnings("deprecation")

public void handleMessage(Message msg) {

if(messageNotificationID<5){

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

// 构建一个通知对象(需要传递的参数有三个,分别是图标,标题和 时间)

Notification notification = new Notification(

R.drawable.ic_launcher, "通知", System.currentTimeMillis());

Intent intent1 = new Intent(SignalrPushService.this,

AllAlarmActivity.class);//跳转到查看的activity

PendingIntent pendingIntent = PendingIntent.getActivity(

SignalrPushService.this, 0, intent1, 0);

notification.setLatestEventInfo(getApplicationContext(), "报警提示",

message, pendingIntent);

notification.flags = Notification.FLAG_AUTO_CANCEL;// 点击后自动消失

notification.defaults = Notification.DEFAULT_SOUND;// 声音默认

manager.notify(messageNotificationID, notification);// 发动通知,id由自己指定,每一个Notification对应的唯一标志

messageNotificationID++;

}

}

};

public class MyBinder extends Binder // ①

{

public String getMessage() {

// 获取Service的运行状态:count

return message;

}

}

@Override

public IBinder onBind(Intent arg0) {

return binder;

}

@Override

public void onCreate() {

super.onCreate();

}

@Override

public int onStartCommand(Intent intent, int flags, int startId) {

new Thread() {

public void run() {

Looper.prepare();

beginConnect();// 从服务端获取消息

Looper.loop();

};

}.start();

return super.onStartCommand(intent, flags, startId);

}

@Override

public void onDestroy() {

super.onDestroy();

this.quit = true;

}

private void beginConnect() {

// TODO Auto-generated method stub

conn = new HubConnection(Icons.HUB_URL, getBaseContext(),

new LongPollingTransport()) {

@Override

public void OnMessage(String message) {

SignalrPushService.this.message = message;

handler.sendEmptyMessage(0);

}

};

conn.getHeaders().put("Cookie",

"BearerToken=" + SharedPref.getToken(getApplicationContext()));

quit = false;

while (!quit) {

try {

hub = conn.CreateHubProxy("clientHub");

} catch (OperationApplicationException e) {

e.printStackTrace();

}

/*

* hub.On("debug1", new HubOnDataCallback() {//addNewMessageToPage

*

* @Override public void OnReceived(JSONArray args) { Message msg =

* handler.obtainMessage(); msg.what = 1; handler.sendMessage(msg);

* Toast.makeText(SignalrPushService.this, args+"",

* Toast.LENGTH_SHORT).show(); } });

*/

conn.Start();

}

}

}

我的服务因为服务器加密了所以得加一步

conn.getHeaders().put("Cookie",

"BearerToken="
+ SharedPref.getToken(getApplicationContext()));

多加了一个head
 cookie

这里是新建了一个线程来启动signalr

到此就实现了推送服务。

时间: 2024-10-12 11:16:52

android 用signalr 实现推送服务的相关文章

Android推送服务开发

由于公司之前使用的手机客户端推送服务是极光推送,给公司造成一年几十万的服务费,因此,公司决定开发自己的一套推送服务,初步的技术选型是: 服务端:netty4 关于netty框架在我的下面的博客里面我整理了相关资料,本来还有一些关于mina的由于时间原因暂时没整理出来. 为了便于自己测试,自己动手实现了如何使用netty完成服务端消息推送以及在Android客户端如何将接受到的信息显示在通知栏,整体思路大概是这样的: 服务端使用netty框架开启基于TCP监听服务. 客户端发起TCP连接(不关闭,

Android推送服务(GCM)----GCM Architectural Overview翻译

GCMArchitectural Overview Google Cloud Messaging for Android (GCM)是一个能够帮助开发者从服务器端发送数据到运行在Android手机上的程序的服务.这个服务提供了一个简单,轻量级的机制使得服务器端可以告诉移动端的程序与服务器端建立直接的联系,来获取更新的程序或者用户的数据.C2DM服务可以处理所有的消息队列的问题并且可以把消息发送到目标机器上运行的目标程序. 简介 GCM的主要特点: 1  它允许第三方的程序服务端发送消息到他们的安

.net平台借助第三方推送服务在推送Android消息(极光推送)

.net平台借助第三方推送服务在推送Android消息(极光推送) 最近做的.net项目(Windows Service)需要向Android手机发送推送消息,真是有点困难,没有搞过就不停的搜文档,最后看到了一个开源项目PushSharp,可以在.net平台推送IOS,Android,Windows Phone等设备消息,大喜,然后先做了IOS的,成功了,但是做Android的时候遇到了问题,一直推送不成功,程序执行了,但是推送一直出不来,后来费劲的在网上搜,没有找到,最后放弃使用这种推送And

SignalR Self Host+MVC等多端消息推送服务(1)

一.概述 由于项目需要,最近公司项目里有个模块功能,需要使用到即时获得审批通知:原本的设计方案是使用ajax对服务器进行定时轮询查询,刚刚开始数据量和使用量不大的时候还好,后来使用量的增加和系统中各种业务的复杂度增加,服务器的压力也越来越大,于是我想使用消息推送的方式替换掉ajax轮询查询,当有审批提交时,调用推送方法,将消息推送到下一审批人那,这样就减低了服务器的压力. Signal 是微软支持的一个运行在.NET平台上的 html websocket 框架.它出现的主要目的是实现服务器主动推

.net平台借助第三方推送服务在推送Android,IOS消息(极光推送)

最近做的.net项目(Windows Service)需要向Android手机发送推送消息,真是有点困难,没有搞过就不停的搜文档,最后看到了一个开源项目PushSharp,可以在.net平台推送IOS,Android,Windows Phone等设备消息,大喜,然后先做了IOS的,成功了,但是做Android的时候遇到了问题,一直推送不成功,程序执行了,但是推送一直出不来,后来费劲的在网上搜,没有找到,最后放弃使用这种推送Android,另寻出路,随后找到了一种C2DM云端推送功能,但是问题又出

巧用apache httpcore-nio实现android推送服务

1. 背景 Android推送服务应用非常广泛,一般有轮询.SMS推送.IP推送几种实现方式.由于轮询的即时性不高.SMS推送需要不菲的费用,所以一般采取IP推送.由于google的IP推送平台C2DM国内被屏蔽,国内涌现很多优秀的推送平台如个推.极光推送.由于实现推送服务有一定技术难度,很多移动互联网应用直接租用这些平台服务,达到快速拓展业务的目标. 但是在一些企业和行业应用场合,限制手机接入互联网,不能采用互联网推送平台,就必须实现自己的推送服务.国内流行的方案是采用开源的androidpn

Android实战——第三方服务之Bmob后端云的推送服务的集成和使用(三)

第三方服务之Bmob后端云的推送服务的集成和使用(三) 事先说明:这里的一切操作都是在集成了BmobSDK之后实现的,如果对Bmob还不了解的话,请关注我第一篇Bmob文章 步骤一:推送服务的集成 在app的build.gradle中添加compile依赖文件: 在manifests文件中配置权限: 在manifests文件中添加需要的配置: 创建一个Receiver接受推送消息: 在Activity的onCreate方法中初始化BmobPush: 在Bmob后台管理中设置: 步骤二:推送服务的

【netty】Netty系列之Netty百万级推送服务设计要点

1. 背景 1.1. 话题来源 最近很多从事移动互联网和物联网开发的同学给我发邮件或者微博私信我,咨询推送服务相关的问题.问题五花八门,在帮助大家答疑解惑的过程中,我也对问题进行了总结,大概可以归纳为如下几类: Netty是否可以做推送服务器? 如果使用Netty开发推送服务,一个服务器最多可以支撑多少个客户端? 使用Netty开发推送服务遇到的各种技术问题. 由于咨询者众多,关注点也比较集中,我希望通过本文的案例分析和对推送服务设计要点的总结,帮助大家在实际工作中少走弯路. 1.2. 推送服务

关于Android端配置极光推送

因为业务需要,android客户端需要加推送,原来采用的百度推送,但是小米手机有时候收不到,后来换成了极光推送,极光的话所有设备都能收到推送,但是在高峰的时候会推迟,博主说的免费版的,收费的没用过,也不错评论 博主用的android studio开发的,.so文件放置的位置啥的可能和eclipse有点不同,感觉用android studio开发jni一类的真的好费劲,博主现在老腻歪了,唉,废话不多说,进入正题: 首先,去极光推送官网注册一系列流程,不过貌似不用认证,老长时间注册的了,忘得差不多了