在android framework中添加自定义系统服务

本文介绍如何在Android系统中添加自定义系统服务,包括创建AIDL接口、实现服务类、注册服务等步骤,并演示了一个获取系统时间和版本号的服务示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 添加系统服务需要添加aidl,service,manager文件,需要修改SystemServer,Context,ContextImpl
  • 下面举例进行说明,主要添加一个服务,用于获取系统时间和版本号


1.在frameworks/base/core/java/android/app/下添加aidl文件

frameworks/base/core/java/android/app/ISystemStatusManager.aidl
package android.app;

interface ISystemStatusManager
{
    String[] getSystemStatus();
}


2.修改frameworks/base/Android.mk文件,将aidl加到该文件中,这样才可以被编译到,否则编译不过

将core/java/android/app/ISystemStatusManager.aidl \加到LOCAL_SRC_FILES后面


3.在frameworks/base/services/core/java/com/android/server/下添加service文件

frameworks/base/services/core/java/com/android/server/SystemStatusManagerService.java
package com.android.server;

import android.app.ISystemStatusManager;
import android.content.Context;
import android.os.Build;
import android.util.Slog;

import java.text.SimpleDateFormat;
import java.util.Date;

public class SystemStatusManagerService extends ISystemStatusManager.Stub {
    private Context mContext;

    public SystemStatusManagerService(Context context) {
        mContext = context;

        Slog.d("SystemStatus", "Date:" + getDateTime() + "\nVersion:" + getVersion());
    }

    @Override
    public String[] getSystemStatus() {
        String[] infos = new String[2];

        infos[0] = "Date:" + getDateTime();
        infos[1] = "Version:" + getVersion();

        return infos;
    }

    private String getDateTime() {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-DD-mm HH:mm:s");
        Date date = new Date(System.currentTimeMillis());

        return format.format(date);
    }

    private String getVersion() {
        return Build.DISPLAY;
    }
}


4.在frameworks/base/core/java/android/app/下添加manager

frameworks/base/core/java/android/app/SystemStatusManager.java
package android.app;

import android.content.Context;
import android.os.RemoteException;
import android.util.Slog;

public class SystemStatusManager {
    Context mContext;
    ISystemStatusManager mService;

    public SystemStatusManager(Context context, ISystemStatusManager service) {
        mContext = context;
        mService = service;
    }

    public String[] getSystemStatus() {
        if (mService != null) {
            try {
                return mService.getSystemStatus();
            } catch (RemoteException e) {
                Slog.e("SystemStatus", "RemoteException " + e);
                return null;
            }
        }

        return null;
    }
}

5.在frameworks/base/core/java/android/content/Context.java中添加service名称定义

public static final String SYSTEM_STATUS_SERVICE = "system_status_service";


6.在frameworks/base/services/java/com/android/server/SystemServer.java中添加服务

  • 在startOtherServices()方法中添加如下代码
try {
    ServiceManager.addService(Context.SYSTEM_STATUS_SERVICE, new SystemStatusManagerService(context));
} catch (Throwable e) {
    Slog.e(TAG, "Failure starting System Status Service ", e);
}


7.在frameworks/base/core/java/android/app/ContextImpl.java中注册服务

  • 在static {}中添加如下代码
registerService(SYSTEM_STATUS_SERVICE, new ServiceFetcher() {
    public Object createService(ContextImpl ctx) {
        IBinder b = ServiceManager.getService(SYSTEM_STATUS_SERVICE);
        return new SystemStatusManager(ctx, ISystemStatusManager.Stub.asInterface(b));
    }
});


8.编译framework.jar和services.jar,push到手机,重启手机

  • 重启手机后就会输出如下log:
D/SystemStatus(  910): Date:2017-01-00 00:00:13
D/SystemStatus(  910): Version:xxx


9.如果系统app需要使用该service,可以通过如下方式调用

SystemStatusManager mManager = (SystemStatusManager) getSystemService(Context.SYSTEM_STATUS_SERVICE);
try {
    String[] infos = mManager.getSystemStatus();
    Log.i("SystemStatus", "SystemStatus Date:" + infos[0] + "\nVersion:" + infos[1]);
} catch (Exception e) {
    e.printStackTrace();
}
Android 11引入了一些新的框架和API,使得开发者能够更容易地添加自定义系统服务。要创建并调用一个自定义系统服务,你可以按照以下步骤操作: 1. **创建Service组件**: 首先,你需要创建一个新的Service类,继承自`android.app.Service`。例如,假设你创建了一个名为`MyCustomService`的服务: ```java public class MyCustomService extends Service { // 定义必要的生命周期回调函数,如onStartCommand() 和 onBind() @Override public int onStartCommand(Intent intent, int flags, int startId) { // 在这里处理启动请求 return START_STICKY; } @Nullable @Override public IBinder onBind(Intent intent) { // 返回Binder,以便外部应用通过Intent绑定到服务 return new MyCustomBinder(); } private class MyCustomBinder extends Binder { // 提供一些方法供外界应用程序调用 public void performCustomAction(String action) { // 自定义业务逻辑 } } } ``` 2. **添加权限和声明**: 在AndroidManifest.xml中,你需要为服务添加相应的权限,并在<application>标签内声明它: ```xml <uses-permission android:name="android.permission.BIND_SERVICE" /> ... <service android:name=".MyCustomService" android:permission="android.permission.BIND_SERVICE"> <intent-filter> <action android:name="com.example.MY_CUSTOM_ACTION" /> </intent-filter> </service> ``` 3. **在App中调用服务**: 为了在你的应用中调用这个服务,你需要发送一个意图(Intent)。例如,在`MainActivity`或`Fragment`中: ```java Intent serviceIntent = new Intent(this, MyCustomService.class); serviceIntent.setAction("com.example.MY_CUSTOM_ACTION"); startService(serviceIntent); // 或者如果服务支持绑定,你可以这样做: IBinder binder = getApplicationContext().bindService(serviceIntent, new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { ((MyCustomBinder) service).performCustomAction("your_action_here"); } @Override public void onServiceDisconnected(ComponentName name) { // 服务断开连接时调用 } }, Context.BIND_AUTO_CREATE); ``` 注意:确保在API级别低于29的应用中,遵循兼容模式并适配旧版本的Android
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值