2016-06-25 2 views
0

これは私のサービスコードです:私の問題は、すべての時間が、私は、メインのアクティビティを入力していることであるAndroidのサービスの実行、複数の

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

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

    startService(i); 

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でこのコードを、それを実行しますサービスを2回または3〜4回実行すると、ソケットで新しいメッセージを受信すると、同じメッセージが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; 
    } 

また、メッセージをデータベースに保存する場合は、メッセージIDと照合して重複メッセージが重複しないようにする必要があります。ソケットが接続されると、すでに受信したメッセージを送信しようとするケースが多くあります。

+0

私はこのメソッドをアクティビティまたはサービスクラスに追加しましたか? 'if(isServiceRunning()== false){// start service}' – medo

+0

このメソッドをアクティビティに配置し、このメソッドを呼び出してから、startサービスを呼び出す前にステータスをチェックします。メソッドがfalseを返した場合にのみサービスを開始します –

+0

私はそれを試し、あなたへの応答:) – medo

関連する問題