Android 之 SystemService

SystemServer是Android系统的一个核心进程,它是由zygote进程创建的,因此在android的启动过程中位于zygote之后。android的所有服务循环都是建立在 SystemServer之上的。在SystemServer中,将可以看到它建立了android中的大部分服务,并通过ServerManager的add_service方法把这些服务加入到了ServiceManager的svclist中。从而完成ServcieManager对服务的管理。

先看下SystemServer的main函数:

 native public static void init1(String[]args);
 public static void main(String[] args) {
        if(SamplingProfilerIntegration.isEnabled()) {
           SamplingProfilerIntegration.start();
            timer = new Timer();
            timer.schedule(new TimerTask() {
                @Override
                public void run() {
                   SamplingProfilerIntegration.writeSnapshot("system_server");
                }
            }, SNAPSHOT_INTERVAL,SNAPSHOT_INTERVAL);
        }
        // The system server has to run all ofthe time, so it needs to be
        // as efficient as possible with itsmemory usage.
       VMRuntime.getRuntime().setTargetHeapUtilization(0.8f);
       System.loadLibrary("android_servers"); //加载本地库android_servers
        init1(args);
    }

在main函数中主要是调用了本地方法init1(args), 他的实现位于../base/services/jni/com_android_server_SystemService.cpp中

static voidandroid_server_SystemServer_init1(JNIEnv* env, jobject clazz)
{
    system_init();
}

进一步来看system_init,在这里面看到了闭合循环管理框架:

runtime->callStatic("com/android/server/SystemServer","init2");//回调了SystemServer.java中的init2方法
    if (proc->supportsProcesses()) {
        LOGI("System server: enteringthread pool.\n");
       ProcessState::self()->startThreadPool();
       IPCThreadState::self()->joinThreadPool();
        LOGI("System server: exitingthread pool.\n");
    }

通过调用com/android/server/SystemServer.java中的init2方法完成service的注册。在init2方法中主要建立了以ServerThread线程,然后启动线程来完成service的注册。

    public static final void init2() {
        Slog.i(TAG, "Entered the Androidsystem server!");
        Thread thr = new ServerThread();
       thr.setName("android.server.ServerThread");
        thr.start();
    }

具体实现service的注册在ServerThread的run方法中:

 try {
            Slog.i(TAG, "EntropyService");
           ServiceManager.addService("entropy", new EntropyService());
            Slog.i(TAG, "PowerManager");
            power = new PowerManagerService();
           ServiceManager.addService(Context.POWER_SERVICE, power);
            Slog.i(TAG, "ActivityManager");
            context =ActivityManagerService.main(factoryTest);
            Slog.i(TAG, "TelephonyRegistry");
           ServiceManager.addService("telephony.registry", newTelephonyRegistry(context));

}



### getSystemService 方法详解 `getSystemService` 是 Android 中用于获取各种系统服务的重要方法。通过该方法可以访问诸如通知管理器、窗口管理器等多种核心组件。 #### 获取常见系统服务实例 以下是几种常见的 `getSystemService` 调用方式: ```java // 获取 ActivityManager 实例 ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); // 获取 NotificationManager 实例 NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); // 获取 PowerManager 实例,可用于创建 WakeLock 对象[^2] PowerManager powerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE); PowerManager.WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyApp::MyWakelockTag"); wakeLock.acquire(); ``` #### 完整示例:使用 AlarmManager 设置定时任务 下面是一个完整的例子,展示如何利用 `getSystemService` 来设置一个简单的闹钟提醒功能: ```java public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 创建 Intent 广播接收者 Intent intent = new Intent(this, MyBroadcastReceiver.class); PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0); // 获取 AlarmManager 服务对象 AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); // 设定触发时间 Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(System.currentTimeMillis()); calendar.add(Calendar.SECOND, 10); // 十秒后触发 // 注册闹钟事件 if (alarmManager != null) { alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent); } } } ``` 此代码片段展示了如何通过调用 `getSystemService()` 函数来获得 `AlarmManager` 的引用,并设置了十秒钟后的报警操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值