2017-08-04 134 views
1

我开发了一个使用SignalR的聊天应用程序。目前我正在将该代码移动到WebAPI上以用于Android应用程序,SignalR在Android手机中推送通知

当用户向Android用户发送消息时,我想在Android手机上显示推送通知。它有可能在Android应用程序中使用SignalR作为客户端。

我看到一些在线参考像谷歌GCm,ShaperChat,但我不理解他们。

回答

1

是的,你可以在android应用程序中使用signalR。但值得一提的是,配置应用程序在前台使用signalR,然后在应用程序在后台运行时使用Firebase推送通知,因为您的signalR连接可以断开连接,然后signalR将不起作用。因此,当应用程序运行时,应使用signalR,否则使用firebase通知系统,因为firebase使用的是Google Play服务,该服务将始终在设备上运行。

简单signalR实现 https://github.com/ngocchung/SimpleSignalRClient

+0

非常好的答案非常感谢您的澄清。这应该是问题的正确答案。 –

1

是的,可以。 首先确保您的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); 
} 
} 

后,您会从服务 获得来电希望你能得到你所需要的。

+0

实际上我是.Net开发者,当用户调用一个Web API Url来获取新的新消息时,如果有服务器更新,那就是我需要在SignalR中像聊天一样开发,同样的机制在android中有效? –

+0

是的,它会工作 –