Android – ¿Por qué se ejecutan varias instancias de este servicio

He escrito un servicio y pienso tener múltiples aplicaciones para comunicarme con él usando Messenger. He seguido el ejemplo del ejemplo de Android Bound Services para messenger . He puesto el servicio dentro de un proyecto de biblioteca de Android y todos los otros proyectos de Android utilizan esa biblioteca.

El problema que tengo es que múltiples instancias del servicio se ejecutan cuando me enlace a él. Cada aplicación se enlaza al servicio de la siguiente manera:

// Bind to the service bindService(new Intent(ApplicationOneActivity.this, MessengerService.class), mConnection, Context.BIND_AUTO_CREATE); 

El servicio es:

 public class MessengerService extends Service { /** Command to the service to display a message */ public static final int MSG_SAY_HELLO = 0; /** Command to the service to display a message from App 1 */ public static final int MSG_APP1_HELLO = 1; public static final int MSG_APP2_HELLO = 2; public static final int MSG_APP3_HELLO = 3; private int[] stat = new int[3]; private Timer timer = null; /** * Handler of incoming messages from clients. */ class IncomingHandler extends Handler { @Override public void handleMessage(Message msg) { switch (msg.what) { case MSG_SAY_HELLO: Toast.makeText(getApplicationContext(), "hello!", Toast.LENGTH_SHORT).show(); break; case MSG_APP1_HELLO: Toast.makeText(getApplicationContext(), "App One says: " + msg.arg1, Toast.LENGTH_SHORT).show(); stat[0] = msg.arg1; break; case MSG_APP2_HELLO: Toast.makeText(getApplicationContext(), "App Two says: " + msg.arg1, Toast.LENGTH_SHORT).show(); stat[1] = msg.arg1; break; case MSG_APP3_HELLO: Toast.makeText(getApplicationContext(), "App Three says: " + msg.arg1, Toast.LENGTH_SHORT).show(); stat[2] = msg.arg1; break; default: super.handleMessage(msg); } } } /** * Target we publish for clients to send messages to IncomingHandler. */ final Messenger mMessenger = new Messenger(new IncomingHandler()); /** * When binding to the service, we return an interface to our messenger * for sending messages to the service. */ @Override public IBinder onBind(Intent intent) { Toast.makeText(getApplicationContext(), "binding", Toast.LENGTH_SHORT).show(); return mMessenger.getBinder(); } @Override public boolean onUnbind(Intent intent) { Toast.makeText(getApplicationContext(), "unbinding", Toast.LENGTH_SHORT).show(); return super.onUnbind(intent); } final Handler handler = new Handler() { public void handleMessage(Message msg) { // Create and send a message to the service, using a supported 'what' value ReportAsyncTask report = new ReportAsyncTask(); report.execute(""); } }; @Override public void onCreate() { super.onCreate(); if (timer == null) { timer = new Timer(); timer.schedule(new ScheduledTaskWithHandeler(), 10000); Toast.makeText(getApplicationContext(), "Register Timer To Report Back ", Toast.LENGTH_SHORT).show(); } } @Override public void onDestroy() { super.onDestroy(); if (timer != null) { timer.cancel(); timer = null; } } class ScheduledTaskWithHandeler extends TimerTask { @Override public void run() { handler.sendEmptyMessage(0); } } private class ReportAsyncTask extends AsyncTask<String, Void, String> { @Override protected String doInBackground(String... urls) { String response = ""; try { String urlParams="device=" + URLEncoder.encode(android.os.Build.MODEL, "UTF-8") + "&status="+URLEncoder.encode("App1 says " + stat[0] + ", App2 says " + stat[1] + ", App3 says " + stat[2],"UTF-8"); String url = "http://192.168.43.143:8080/SimpleServlet3/monitor-servlet"; HttpClient httpclient = new DefaultHttpClient(); HttpGet httpget = new HttpGet(url+"?"+urlParams); HttpResponse httpresponse = httpclient.execute(httpget); HttpEntity entity = httpresponse.getEntity(); if (entity != null) { InputStream instream = entity.getContent(); int l; byte[] tmp = new byte[2048]; while ((l = instream.read(tmp)) != -1) { response += l; } } timer.schedule(new ScheduledTaskWithHandeler(), 10000); } catch (Exception e) { e.printStackTrace(); } return response; } @Override protected void onPostExecute(String result) { Toast.makeText(getApplicationContext(), "Server says " + result, Toast.LENGTH_SHORT).show(); } } } 

El Manifiesto para cada Aplicación se parece más a menos:

 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.app1" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="11" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <application android:icon="@drawable/spinifex" android:label="@string/app_name" > <activity android:name=".ApplicationOneActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <service android:name="com.example.services.MessengerService" android:process=":remote" /> </application> </manifest> 

Alguna idea de lo que estoy haciendo mal? Los mensajes Toast muestran de forma bastante concluyente que se están ejecutando varias instancias del mismo servicio. ¿Es incorrecta la estructura de mi proyecto? ¿No debo poner el servicio en un proyecto separado de la Biblioteca?

Debe declarar la etiqueta <service /> sólo en un AndroidManifest, y en otras aplicaciones debe enlazar a través del nombre completo del componente. Como:

 Intent intent = new Intent(); intent.setClassName( "com.example.app1" /* your package which contains service */, "com.example.services.MessengerService" /* service name */ ); bindService(intent, mConnection, Context.BIND_AUTO_CREATE); 

Además , cuando haces android:process=":remote" , dices a android que el proceso es privado para la aplicación actual.

  • Cambiar la configuración de WiFi en Android 5 (L) mediante programación
  • Cómo deslizar un ImageView de izquierda a derecha suavemente en Android?
  • ¿Es posible iniciar una actividad de la aplicación de Android cuando se inicia el teléfono?
  • Robolectric usando Fragments y ActionBarCompat NullPointerException
  • Determine el ancho de banda de conexión de red (velocidad) wifi y datos móviles
  • Cómo animar un cuadro de búsqueda en android
  • Datos de Android Exif en archivo JPEG
  • ¿Por qué no desaparece el teclado virtual?
  • ¿Cómo encontrar el grado del valor de la latitud en android?
  • Gson, cómo deserializar matriz o cadena vacía
  • Cambiar (Pulgar y Seguir) Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.