2016-06-25 5 views
0

Это мой код услуги:Android службы запустить несколько

public class MyCustomService extends Service { 
public static final String INPUT_TEXT="INPUT_TEXT"; 
public static final String OUTPUT_TEXT="OUTPUT_TEXT"; 
private volatile HandlerThread mHandlerThread; 
private ServiceHandler mServiceHandler; 
public Socket client; 

// ... 

// Define how the handler will process messages 
private final class ServiceHandler extends Handler { 
    public ServiceHandler(Looper looper) { 
     super(looper); 
    } 

    // Define how to handle any incoming messages here 
    @Override 
    public void handleMessage(Message message) { 
     // ... 
     // When needed, stop the service with 
     // stopSelf(); 
    } 
} 

// Fires when a service is first initialized 
public void onCreate() { 
    super.onCreate(); 
    // An Android handler thread internally operates on a looper. 
    mHandlerThread = new HandlerThread("MyCustomService.HandlerThread"); 
    mHandlerThread.start(); 
    // An Android service handler is a handler running on a specific background thread. 
    mServiceHandler = new ServiceHandler(mHandlerThread.getLooper()); 

} 


// Fires when a service is started up 
@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    // Send empty message to background thread 
    mServiceHandler.sendEmptyMessageDelayed(0, 500); 
    // or run code in background 
    mServiceHandler.post(new Runnable() { 
     @Override 
     public void run() { 
      // Do something here in background! 

      IO.Options opts = new IO.Options(); 
      opts.query = "auth_token=51"; 
      try { 
       client = IO.socket("http://192.168.0.106:3000/",opts); 
       client.on("message", onMessage); 
       client.connect(); 
      } catch (URISyntaxException e) { 
       e.printStackTrace(); 
      } 


      // If desired, stop the service 
      //stopSelf(); 
     } 
    }); 
    // Keep service around "sticky" 
    return START_STICKY; 
} 

// ... 

// Defines the shutdown sequence 
@Override 
public void onDestroy() { 
    // Cleanup service before destruction 
    client.disconnect(); 
    client.close(); 
    mHandlerThread.quit(); 
} 

private Emitter.Listener onMessage = new Emitter.Listener() { 
    @Override 
    public void call(Object... args) { 
     String message = (String) args[0]; 
     Log.d("recive message message message", message); 

     /*create new intent to broadcast our processed data to our activity*/ 
     Intent resultBroadCastIntent = new Intent(); 
     /*set action here*/ 
     //resultBroadCastIntent.setAction(TextCapitalizeResultReceiver.ACTION_TEXT_CAPITALIZED); 
     resultBroadCastIntent.setAction(Intent.ACTION_SEND); 
     /*set intent category as default*/ 
     // resultBroadCastIntent.addCategory(Intent.CATEGORY_DEFAULT); 
     /*add data to intent*/ 
     resultBroadCastIntent.putExtra(OUTPUT_TEXT, message); 
     /*send broadcast */ 
     sendBroadcast(resultBroadCastIntent); 

    } 
}; 


@Override 
public IBinder onBind(Intent intent) { 
    return null; 
} 
} 

И я запускаю его от деятельности этот код в OnCreate:

Intent i = new Intent(this, MyCustomService.class); 

    i.putExtra("foo", "bar"); 

    startService(i); 

Моя проблема заключается в том, что каждый раз, когда я вхожу в основную активность и ее запустите службу дважды или 3 или 4 раза, поэтому, когда я получаю новое сообщение через сокет, он получает одно и то же сообщение три или четыре раза.

ответ

1

Вы должны сначала проверить, запущена ли служба, если нет, то запустите службу.

/** 
    * @param serviceClass Class name of Service 
    * @return - boolean indicating running status of Service 
    */ 
    public static boolean isServiceRunning(Context context, Class<?> serviceClass) { 
     ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); 
     for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) { 
      if (serviceClass.getName().equals(service.service.getClassName())) { 
       return true; 
      } 
     } 
     return false; 
    } 

Кроме того, если вы сохраняете сообщения в базе данных, вы должны поставить сверять идентификатор сообщения, поэтому дубликат сообщение не суммируется там. Будет много случаев, когда сокет при подключении попытается отправить вам уже полученное сообщение.

+0

Я добавил этот метод в действие или в класс обслуживания? 'if (isServiceRunning() == false) {// start service}' – medo

+0

Поместите этот метод в свою деятельность и вызовите этот метод, а затем проверьте статус, прежде чем совершать звонок, чтобы начать службу. Только запустите службу, если метод возвращает false –

+0

Я попробую и ответ вам :) – medo