如何在Android框架中添加我们自己的系统服务?

如何在Android框架中添加我们自己的系统服务?,android,android-service,Android,Android Service,我是android新手,我一直在分析android源代码,以了解系统服务是如何实现的。我的问题是我是否能够创建自己的系统服务并将其添加到框架中,以便所有应用程序都能够访问我的服务。 任何注释/代码片段都会很有帮助 提前感谢回复者 public class MyService extends Service { private static MyService instance = null; public static boolean isInstanceCreated(){

我是android新手,我一直在分析android源代码,以了解系统服务是如何实现的。我的问题是我是否能够创建自己的系统服务并将其添加到框架中,以便所有应用程序都能够访问我的服务。 任何注释/代码片段都会很有帮助

提前感谢回复者

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)); 

对于系统服务,还需要更多。本质上,至少对于Android 2.3,必须扩展SystemServer.java,以便在system_服务器启动时实例化新服务

德州仪器公司提供了一个很好的例子:


CyanogenMod SystemServer.java还提供了动态加载系统服务的代码,如config.xml中数组“config_vendorServices”中定义的(请参阅core/res/res/values/config.xml),我相信可以在供应商或设备目录中覆盖该代码。然而,我们自己还没有尝试过使用它,我不知道这是否是2.3.[45]的CyanogenMod特有的或通用的。请按照以下步骤在android框架中编写您自己的系统服务

  • 通过继承存根,使用公开的API编写您自己的服务/管理器
  • 为您的服务创建一个aidl文件,以在生成中公开和包含
  • 在系统服务器中添加您的服务,您的服务将与所有核心服务一起启动
  • 在context impl文件中注册您的服务上下文
  • 通过调用getSystemService(服务的上下文)在应用程序中使用服务

  • PS:若您的服务出现致命异常,设备将软重启,因为您的服务是在系统服务下运行的

    您可以添加自己的服务,但无法添加系统服务,除非您可以修改框架源代码

    系统服务以系统权限在系统服务器中运行,允许这些服务访问正常应用程序服务无法访问的系统资源


    谢谢谢里夫,我可以在android框架内实现此代码片段,以便设备中的所有应用程序都可以共享我的服务。如果可以,请告诉我实现步骤。当然可以,但它需要IBinder和很多东西。。只需检查myService应该是myService,除非您试图混淆people@I_AM_PANDA我刚读到这个。谢谢,我将编辑答案。另一方面,你把我的审判限制在人身上,我几乎感到受辱。我还希望/试图混淆机器人、外星人,也许还有其他生物或非生物。为了防止其他人来到这里,几年前随着ICS的升级,CyanogenMod中的VendorService功能被删除。此外,由于SELinux处于强制模式,您需要在external/sepolicy/service_contexts中列出您的服务名称。Google建议您在
    设备//
    目录中通过
    BoardConfig.mk
    添加SELinux配置:有人在android O code中添加了新的系统服务吗?。看起来JNI语法和框架层也发生了一些变化。第3步似乎要求您更改AOSP代码?@zaitsman是的,您可以检查此源代码,尽管它不是maintend,但它将为您提供基本的想法