Как добавить наш собственный системный сервис в Android Framework? - PullRequest
12 голосов
/ 11 июля 2011

Я новичок в Android и анализирую исходный код Android, чтобы понять, как реализованы системные сервисы. Мой вопрос заключается в том, могу ли я создать свою собственную системную службу и добавить ее в платформу, чтобы все приложения могли иметь доступ к моей службе. Любые комментарии / фрагменты кода будут полезны.

Заранее спасибо Ответчику.

Ответы [ 4 ]

15 голосов
/ 15 сентября 2011

Для системного обслуживания требуется больше. По сути, по крайней мере для Android 2.3, SystemServer.java должен быть расширен, чтобы новая служба создавалась при запуске system_server.

Texas Instruments любезно предоставил хороший пример:

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

CyanogenMod SystemServer.java также содержит код для динамической загрузки системных служб, как определено в массиве "config_vendorServices" в config.xml (см. Core / res / res / values ​​/ config.xml), который, я считаю, может быть перезаписан в каталоги поставщика или устройства. Однако мы сами не пытались использовать это, и я не знаю, является ли это специфичным для CyanogenMod или общим для 2.3. [45].

10 голосов
/ 25 апреля 2015

Вы можете добавить свой собственный сервис, но нет способа добавить системный сервис, если вы не можете изменить исходный код платформы.

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

В этой статье подробно объясняется, как реализована системная служба в Android. enter image description here

6 голосов
/ 31 июля 2013

Выполните следующие шаги для написания своей собственной системной службы в платформе Android.

  1. Напишите свой собственный сервис / менеджер с открытыми API-интерфейсами, унаследовав заглушку.
  2. Создайте вспомогательный файл для вашего сервиса, который будет доступен и включен в сборку.
  3. Добавьте ваш сервис в System Server, ваш сервис запустится вместе со всеми основными сервисами.
  4. Зарегистрируйте ваш контекст службы в файле context impl.
  5. Используйте ваш сервис в приложении, вызвав getSystemService (Контекст вашего сервиса)

PS: если ваш сервис получит какое-то фатальное исключение, устройство будет мягко перезагружено, так как ваш сервис работает под управлением системного сервиса.

3 голосов
/ 11 июля 2011
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;
    }
}

В вашей деятельности:

if(!MyService.isInstanceCreated())
        startService(new Intent(YourActivityClassName.this, MyService.class)); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...