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

发布于 2024-11-19 05:14:56 字数 129 浏览 6 评论 0原文

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

提前感谢回复者。

I am new to android and i have been analyzing the android source code to understand how the System services are implemented. My Question is am I able to create my own System Service and add it to the framework so that all the applications should be Able to access my service.
Any comments/Code snippets would be helpful.

Thanks to the Replier in advance.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

任性一次 2024-11-26 05:14:56

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

德州仪器 (TI) 提供了一个很好的示例:

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

CyanogenMod SystemServer.java 还具有用于动态加载系统服务的代码,如 config.xml 中的数组“config_vendorServices”中定义的(请参阅 core/res/res/values/config.xml),我将其相信可以在供应商或设备目录中覆盖。然而,我们自己还没有尝试使用它,我不知道这是 CyanogenMod 特有的还是 2.3.[45] 共有的。

For a system service, more is needed. Essentially, at least for Android 2.3, the SystemServer.java must be extended so that the new service gets instantiated when the system_server starts.

Texas Instruments has kindly provided a nice example:

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

The CyanogenMod SystemServer.java has also code for dynamically loading system services as defined in the array "config_vendorServices" in config.xml (see core/res/res/values/config.xml), which I believe can be overwritten in the vendor or device directories. However, we haven't tried to use that ourselves, and I don't know if that is CyanogenMod specific or common to 2.3.[45].

白云悠悠 2024-11-26 05:14:56

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

系统服务以系统权限运行在system_sever中,这使得这些服务可以访问普通应用程序服务无法访问的系统资源。

这篇文章详细讲解了Android中系统服务是如何实现的. 在此处输入图像描述

You can add your own service but there is no way to add system service, unless you can modify the framework source code.

System services are running in system_sever with system privilege, which allow those service can access system resource that normal application service can't.

This article explain in detail how the system service are implemented in Android. enter image description here

从﹋此江山别 2024-11-26 05:14:56

按照以下步骤在 android 框架中编写自己的系统服务。

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

PS:如果您的服务遇到一些致命异常,设备将软重启,因为您的服务在系统服务下运行。

Follow the below steps for writing your own System Service in android framework.

  1. Write your Own Service/Manager with API's exposed by inheriting the stub.
  2. Create an aidl file for your service to expose & include in build.
  3. Add your service in System Server, you service will start along with all core services.
  4. Register your service context in context impl file.
  5. Use your service in application by calling getSystemService(Context of your service)

PS: if your service get some fatal exception, device will soft reboot, as your service is running under system service.

佞臣 2024-11-26 05:14:56
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)); 
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;
    }
}

In your activity:

if(!MyService.isInstanceCreated())
        startService(new Intent(YourActivityClassName.this, MyService.class)); 
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文