如何在android服务中使用signar
我使用了信号器库,给我造成的问题是,当手机进入睡眠时,它将发出一个连接超时错误,并且将不再连接到服务器 活跃 在职 在Manifests.xml中 信息广播 网络状态广播如何在android服务中使用signar,android,service,signalr,connection-timeout,sleep-mode,Android,Service,Signalr,Connection Timeout,Sleep Mode,我使用了信号器库,给我造成的问题是,当手机进入睡眠时,它将发出一个连接超时错误,并且将不再连接到服务器 活跃 在职 在Manifests.xml中 信息广播 网络状态广播 是的,你可以。首先,确保您的信号器服务工作正常,并记下您的令牌和集线器连接、组名,您可以通过调用它们来订阅这些调用 1) 上了一节单身班 public class SignalRSingleton { private static SignalRSingleton mInstance = null; public HubCo
是的,你可以。首先,确保您的信号器服务工作正常,并记下您的令牌和集线器连接、组名,您可以通过调用它们来订阅这些调用 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);
}
}
公共类信号服务扩展服务{
//专用HUB连接mHUB连接;
//私有hubbroxy-mhubbroxy;
私有处理程序mHandler;//显示Toast消息
private final IBinder mBinder=new LocalBinder();//提供给客户端的绑定器
私人信号单分钟;
最终静态字符串MY\u ACTION=“MY\u ACTION”;
公共信号服务(){
}
@凌驾
public void onCreate(){
super.onCreate();
minInstance=signalsingleton.getInstance();
mHandler=新处理程序(Looper.getMainLooper());
}
@凌驾
公共int onStartCommand(Intent Intent、int标志、int startId){
int result=super.onStartCommand(intent、flags、startId);
startSignalR();
返回结果;
}
@凌驾
公共空间{
mHubConnection.stop();
super.ondestory();
}
@凌驾
公共IBinder onBind(意向){
//将通信通道返回到服务。
startSignalR();
返回mBinder;
}
/**
*用于客户端绑定器的类。因为我们总是知道此服务
*与客户端在同一进程中运行,我们不需要处理IPC。
*/
公共类LocalBinder扩展了Binder{
公共信号服务getService(){
//返回此SignalRService实例,以便客户端可以调用公共方法
return signalservice.this;
}
}
/**
*客户(活动)的方法
*/
私有无效开始信号(){
loadPlatformComponent(新的AndroidPlatformComponent());
minInstance.setmHubConnection();
mInstance.setHubProxy();
ClientTransport ClientTransport=新服务器SentEventsTransport(minInstance.mHubConnection.getLogger());
SignalFuture SignalFuture=minInstance.mHubConnection.start(客户端传输);
试一试{
SignalFuture.get();
}捕获(中断异常|执行异常e){
Log.e(“simpleSignal”,e.toString());
返回;
}
sendMessage(MainActivity.unm,“大家好!”);
字符串CLIENT\u METHOD\u BROADAST\u MESSAGE=“receivedMessage”;
//字符串CLIENT\u METHOD\u BROADAST\u MESSAGE=“messageReceived”;
minInstance.mHubProxy.on(客户端方法消息,
新的SubscriptionHandler2(){
@凌驾
公共无效运行(最终字符串消息,最终登录信息登录信息){
最后一个字符串finalMsg=loginInfo.FullName+“表示”+loginInfo.Password;
意图=新意图();
意图。设置动作(我的动作);
意向。额外(“数据传递”,最终SG);
发送广播(意图);
}
}
,String.class,LoginInfo.class);
}
}
在您接到服务部门的电话后,希望您能得到所需的。您需要在android上的服务中运行hub脚本,并在手机休眠时保持其运行。@Farrukhshubani谢谢。可以用一段简单的代码来编写一个没有这个问题的服务吗?我想没有人在C#for.NET中有这样的功能吗?自己转换一下,这相当容易,不是吗?
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="************.signalr2">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver android:name=".MyStartServiceReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
<service
android:name=".SignalRService"
android:enabled="true"
android:exported="false"
android:label="Sig"
android:largeHeap="true"
android:stopWithTask="false" />
<receiver
android:name=".BroadCastMessage"
android:enabled="true">
<intent-filter>
<action android:name="MessageAction" />
</intent-filter>
</receiver>
<receiver
android:name=".NetworkChangeReceiver"
android:enabled="true">
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
</receiver>
<receiver
android:name=".Screen"
android:enabled="true">
<intent-filter>
<action android:name="android.intent.action.SCREEN_OFF" />
<action android:name="android.intent.action.SCREEN_ON" />
</intent-filter>
</receiver>
</application>
public class MyStartServiceReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
context.stopService(new Intent(context.getApplicationContext() , SignalRService.class));
context.startService(new Intent(context.getApplicationContext(), SignalRService.class));
}
}
public class BroadCastMessage extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.d("Service" , "Message-----------------------------------------------------------------------");
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context)
.setSmallIcon(R.mipmap.ic_launcher)
.setContentTitle("Hi")
.setPriority(Notification.PRIORITY_MAX)
.setCategory(Notification.CATEGORY_CALL)
.setDefaults(Notification.FLAG_AUTO_CANCEL | Notification.DEFAULT_SOUND)
.setContentText(intent.getStringExtra("Message") + "")
.setAutoCancel(true)
.setLights(Color.parseColor("red"), 2000, 1000);
NotificationManager mNotifyMgr = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
mNotifyMgr.notify(100, mBuilder.build());
}
}
public class NetworkChangeReceiver extends BroadcastReceiver {
private Boolean isConnected = false;
@Override
public void onReceive(final Context context, final Intent intent) {
final ConnectivityManager connMgr = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
final NetworkInfo wifi = connMgr
.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
final NetworkInfo mobile = connMgr
.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
if (wifi.isAvailable() || mobile.isAvailable()) {
if (isConnected(context)) {
try {
context.stopService(new Intent(context , SignalRService.class));
context.startActivity(new Intent(context , SignalRService.class));
} catch (Exception ex) {}
}
} else {
// isConnected = false;
}
}
public static void registerWifiReceiver(Context context, BroadcastReceiver broadcastReceiver) {
IntentFilter filter = new IntentFilter();
filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
context.registerReceiver(broadcastReceiver, filter);
}
public static boolean isConnected(Context context) {
boolean connectedState = isNetworkAvailable(context) || isWifiAvailable(context);
return connectedState;
}
public static boolean isNetworkAvailable(Context context) {
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo mobileNetworkInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
return mobileNetworkInfo != null && mobileNetworkInfo.isConnected();
}
public static boolean isWifiAvailable(Context context) {
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo wifiNetworkInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
return wifiNetworkInfo != null && wifiNetworkInfo.isConnected();
}
}
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);
}
}
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);
}
}