2011-07-11 9 views
6

Soy nuevo en Android y he estado analizando el código fuente de Android para comprender cómo se implementan los servicios del sistema. Mi pregunta es si puedo crear mi propio servicio del sistema y agregarlo al marco para que todas las aplicaciones puedan acceder a mi servicio. Cualquier comentario/fragmento de código sería útil.¿Cómo agregar nuestro propio servicio de sistema en Android Framework?

Gracias a la Replier con anticipación.

Respuesta

4
public class MyService extends Service { 

    private static MyService instance = null; 

    public static boolean isInstanceCreated(){ 
     return instance != null; 
    } 
    @Override 
    public IBinder onBind(Intent arg0) { 
     // TODO Auto-generated method stub 
     return null; 
    } 
    @Override  
    public void onStart(Intent intent, int startId) { 
     super.onStart(intent, startId); 
     //Toast.makeText(this, "onStart", Toast.LENGTH_SHORT).show(); 
     } 
    @Override 
    public void onCreate() { 
     super.onCreate(); 
     instance = this; 
     new Thread(threadBody).start(); 
    } 
    @Override  
    public void onDestroy() { 
     instance = null; 
    } 
} 

En su actividad:

if(!MyService.isInstanceCreated()) 
     startService(new Intent(YourActivityClassName.this, MyService.class)); 
+0

Gracias Sherif, ¿Puedo poner en práctica este fragmento de código en el interior del marco de Android, por lo que mi servicio puede ser compartida por todas las aplicaciones en la device.If así, por favor hágamelo saber los pasos para la puesta en práctica . –

+0

Sí, claro, pero necesita el IBinder y muchas cosas más ... solo revise http://developer.android.com/reference/android/app/Service.html –

+0

myService debe ser MyService, a menos que intente confundir a las personas –

13

Para un servicio del sistema, se necesita más. Esencialmente, al menos para Android 2.3, el SystemServer.java debe extenderse para que el nuevo servicio se convierta en instancia cuando se inicie system_server.

Texas Instruments ha proporcionado amablemente un buen ejemplo:

http://processors.wiki.ti.com/index.php/Android-Adding_SystemService

El CyanogenMod SystemServer.java ha también código para cargar dinámicamente servicios del sistema como se define en las "config_vendorServices" array en config.xml (ver núcleo /res/res/values/config.xml), que creo que se puede sobrescribir en los directorios del proveedor o del dispositivo. Sin embargo, no hemos intentado usar eso nosotros mismos, y no sé si eso es específico de CyanogenMod o común a 2.3. [45].

+1

En caso de que alguien más termine aquí, la función vendorsServices se eliminó en CyanogenMod hace varios años con la actualización a ICS. – bmaupin

+0

Además, con SELinux en modo obligatorio, deberá incluir en la lista blanca el nombre de su servicio en external/sepolicy/service_contexts – Memetic

+0

Tenga en cuenta que Google recomienda agregar configuraciones de SELinux a través de 'deviceConfig.mk' en su directorio' device// ': https://source.android.com/devices/tech/security/selinux/implement.html –

3

Siga los pasos a continuación para escribir su propio Servicio del sistema en Android.

  1. Escriba su propio Servicio/Administrador con API expuestas heredando el talón.
  2. Cree un archivo de ayuda para su servicio para exponer & incluir en compilación.
  3. Agregue su servicio en Servidor del sistema, su servicio se iniciará junto con todos los servicios básicos.
  4. Registre su contexto de servicio en el archivo contexto impl.
  5. utilizar su servicio de solicitud llamando getSystemService (Contexto de su servicio)

PD: si su servicio de conseguir un poco de excepción grave, dispositivo se reiniciará suave, como su servicio se ejecuta en servicio del sistema.

+0

El paso 3 parece requerir que modifique el código AOSP? – zaitsman

+0

@zaitsman sí, puedes consultar este código fuente http://processors.wiki.ti.com/index.php/Android-Adding_SystemService Aunque no se trata de una actualización, te dará una idea básica –

Cuestiones relacionadas