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=":82/signalr/hubs";@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(R.layout.signalr_layout);goback = (ImageButton) findViewById(R.id.goback);goback.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View arg0) {// TODO Auto-generated method stubSignalrActivity.this.finish();}});what = (TextView) findViewById(R.id.what);conn = new HubConnection(Icons.HUB_URL, this,new LongPollingTransport()) {@Overridepublic void OnError(Exception exception) {}@Overridepublic void OnMessage(String message) {what.setText(message);}@Overridepublic void OnStateChanged(StateBase oldState, StateBase newState) {}};conn.getHeaders().put("Cookie","BearerToken=" + SharedPref.getToken(getApplicationContext()));beginConnect();}private void beginConnect() {// TODO Auto-generated method stubtry {hub = conn.CreateHubProxy("clientHub");} catch (OperationApplicationException e) {e.printStackTrace();}hub.On("debug1", new HubOnDataCallback() {//addNewMessageToPage@Overridepublic 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);//跳转到查看的activityPendingIntent 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的运行状态:countreturn message;}}@Overridepublic IBinder onBind(Intent arg0) {return binder;}@Overridepublic void onCreate() {super.onCreate();}@Overridepublic 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);}@Overridepublic void onDestroy() {super.onDestroy();this.quit = true;}private void beginConnect() {// TODO Auto-generated method stubconn = new HubConnection(Icons.HUB_URL, getBaseContext(),new LongPollingTransport()) {@Overridepublic 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

到此就实现了推送服务。

片的时光如浮云般流过,我们的青春单薄的穿梭在蓝天之上。

android 用signalr 实现推送服务

相关文章:

你感兴趣的文章:

标签云: