我开发了一个使用SignalR的聊天应用程序。目前我正在将该代码移动到WebAPI上以用于Android应用程序,SignalR在Android手机中推送通知
当用户向Android用户发送消息时,我想在Android手机上显示推送通知。它有可能在Android应用程序中使用SignalR作为客户端。
我看到一些在线参考像谷歌GCm,ShaperChat,但我不理解他们。
我开发了一个使用SignalR的聊天应用程序。目前我正在将该代码移动到WebAPI上以用于Android应用程序,SignalR在Android手机中推送通知
当用户向Android用户发送消息时,我想在Android手机上显示推送通知。它有可能在Android应用程序中使用SignalR作为客户端。
我看到一些在线参考像谷歌GCm,ShaperChat,但我不理解他们。
是的,你可以在android应用程序中使用signalR。但值得一提的是,配置应用程序在前台使用signalR,然后在应用程序在后台运行时使用Firebase推送通知,因为您的signalR连接可以断开连接,然后signalR将不起作用。因此,当应用程序运行时,应使用signalR,否则使用firebase通知系统,因为firebase使用的是Google Play服务,该服务将始终在设备上运行。
简单signalR实现 https://github.com/ngocchung/SimpleSignalRClient
是的,可以。 首先确保您的SignalR服务工作正常,记下您的令牌和集线器连接,您可以通过调用它们订阅这些呼叫的群组名称。
1)制造一个单例类
public class SignalRSingleton {
private static SignalRSingleton mInstance = null;
public HubConnection mHubConnection;
public HubProxy mHubProxy;
public static SignalRSingleton getInstance(){
if(mInstance == null)
{
mInstance = new SignalRSingleton();
}
return mInstance;
}
public void setmHubConnection()
{
String serverUrl = "http://192.168.1.5:8089/XM/";
//String serverUrl = "http://192.168.1.184/test";
mHubConnection = new HubConnection(serverUrl);
}
public void setHubProxy()
{
/* Credentials credentials = new Credentials() {
@Override
public void prepareRequest(Request request) {
request.addHeader("User-Name", MainActivity.unm);
}
};*/
//mHubConnection.setCredentials(credentials);
String SERVER_HUB_CHAT = "messages";
//String SERVER_HUB_CHAT = "Chat";
mHubProxy = mHubConnection.createHubProxy(SERVER_HUB_CHAT);
}
/**
* method for clients (activities)
*/
public void sendMessage(String name , String message) {
String str = "{'RequestMessage':{'PID':'lr1','Password':'GIefhSIC5iBCnxioufbwEw == '},'RequestType':'Login'}";
String SERVER_METHOD_SEND = "getMessage";
//String SERVER_METHOD_SEND = "Send";
mHubProxy.invoke(SERVER_METHOD_SEND,str);
}
}
2)然后实现服务
public class SignalRService extends Service {
//private HubConnection mHubConnection;
//private HubProxy mHubProxy;
private Handler mHandler; // to display Toast message
private final IBinder mBinder = new LocalBinder(); // Binder given to clients
private SignalRSingleton mInstance;
final static String MY_ACTION = "MY_ACTION";
public SignalRService() {
}
@Override
public void onCreate() {
super.onCreate();
mInstance = SignalRSingleton.getInstance();
mHandler = new Handler(Looper.getMainLooper());
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
int result = super.onStartCommand(intent, flags, startId);
startSignalR();
return result;
}
@Override
public void onDestroy() {
mInstance.mHubConnection.stop();
super.onDestroy();
}
@Override
public IBinder onBind(Intent intent) {
// Return the communication channel to the service.
startSignalR();
return mBinder;
}
/**
* Class used for the client Binder. Because we know this service always
* runs in the same process as its clients, we don't need to deal with IPC.
*/
public class LocalBinder extends Binder {
public SignalRService getService() {
// Return this instance of SignalRService so clients can call public methods
return SignalRService.this;
}
}
/**
* method for clients (activities)
*/
private void startSignalR() {
Platform.loadPlatformComponent(new AndroidPlatformComponent());
mInstance.setmHubConnection();
mInstance.setHubProxy();
ClientTransport clientTransport = new ServerSentEventsTransport(mInstance.mHubConnection.getLogger());
SignalRFuture<Void> signalRFuture = mInstance.mHubConnection.start(clientTransport);
try {
signalRFuture.get();
} catch (InterruptedException | ExecutionException e) {
Log.e("SimpleSignalR", e.toString());
return;
}
mInstance.sendMessage(MainActivity.unm,"Hello All!");
String CLIENT_METHOD_BROADAST_MESSAGE = "recievedMessage";
//String CLIENT_METHOD_BROADAST_MESSAGE = "messageReceived";
mInstance.mHubProxy.on(CLIENT_METHOD_BROADAST_MESSAGE,
new SubscriptionHandler2<String,LoginInfo>() {
@Override
public void run(final String msg,final LoginInfo loginInfo) {
final String finalMsg = loginInfo.FullName + " says " + loginInfo.Password;
Intent intent = new Intent();
intent.setAction(MY_ACTION);
intent.putExtra("DATAPASSED", finalMsg);
sendBroadcast(intent);
}
}
, String.class,LoginInfo.class);
}
}
后,您会从服务 获得来电希望你能得到你所需要的。
实际上我是.Net开发者,当用户调用一个Web API Url来获取新的新消息时,如果有服务器更新,那就是我需要在SignalR中像聊天一样开发,同样的机制在android中有效? –
是的,它会工作 –
非常好的答案非常感谢您的澄清。这应该是问题的正确答案。 –