系统服务
1. 在SystemServer中启动 2. 添加到ServiceManager 3. 被认为是强制性的,并在失败时软重启设备 4. 更多权限?(不确定它能做什么服务不能做)
服务
1. 使用Intent初始化和启动
除此之外还有其他不同吗?我正在修改AOSP以包括自己的服务,任何额外提供的信息都将有助于帮助我做出决定。
所有系统服务都在同一个名为system_server的进程中运行。
系统服务可以做很多事情,但服务不能。系统服务通常具有更高级别和更特定的sepolicy,正常应用程序将不具备此功能,例如(更改NFC硬件参数)。
因此,如果您想添加自己的系统服务,请注意上述事项,如果您的代码出现死锁,将影响所有系统服务。而且没有sepolicy,则您的服务可能仍无法访问某些资源。
Android服务
Android服务是一种系统组件,允许在不与用户交互的情况下执行较长时间的操作。
像Activity
一样,Service
也在主线程上运行,并具有生命周期,但不同于Activity
,Service
没有UI界面。
任何人都可以使用和创建Service
或其直接子类IntentServcice
在他们的应用程序中,并且它可以很好地工作。
常见用途包括:播放媒体、从互联网下载文件等。
系统服务
系统服务是SystemService类的直接衍生物。它们位于AOSP树中的
com.android.server
包中。
https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/services/
系统服务也在主线程中运行,因此如果您想执行一些CPU密集型任务,则必须重复使用AOSP的HandlerThread
架构。
系统服务与Android服务有何不同?
系统服务由SystemServer
启动,因此它们作为系统进程运行,这使它们具有额外的权限,这是普通Android服务永远无法获得的,因此将其命名为SystemService。
例如:您不能使用Instrumentation向除自己的应用程序之外的其他应用程序注入事件,因为您将需要INJECT_EVENT
权限,而普通应用程序没有被授予该权限。 SystemService
可以执行此操作,因为它们具有提升的访问权限。
系统服务的简单示例:
package com.android.server.appwidget;
import android.content.Context;
import com.android.server.AppWidgetBackupBridge;
import com.android.server.FgThread;
import com.android.server.SystemService;
/**
* SystemService that publishes an IAppWidgetService.
*/
public class AppWidgetService extends SystemService {
private final AppWidgetServiceImpl mImpl;
public AppWidgetService(Context context) {
super(context);
mImpl = new AppWidgetServiceImpl(context);
}
@Override
public void onStart() {
mImpl.onStart();
publishBinderService(Context.APPWIDGET_SERVICE, mImpl);
AppWidgetBackupBridge.register(mImpl);
}
@Override
public void onBootPhase(int phase) {
if (phase == PHASE_ACTIVITY_MANAGER_READY) {
mImpl.setSafeMode(isSafeMode());
}
}
@Override
public void onStopUser(int userHandle) {
mImpl.onUserStopped(userHandle);
}
@Override
public void onSwitchUser(int userHandle) {
mImpl.reloadWidgetsMaskedStateForGroup(userHandle);
}
}
它们非常不同。它们的高级区别如下:
服务(Service)是一个应用程序组件,类似于没有用户界面的Activity。您可以扩展它以在您的应用程序中创建自己的版本。
系统服务(System Service)是系统服务器(System Server)的一部分。您需要修改AOSP以添加自己的系统服务:提供其API类[MySystem]Manager、其实现类[MySystem]Service、其AIDL文件I[MySystem]Service.aidl等。然后,您可以通过调用Context.getSystemService(...)来访问它。
称它们两者都是服务(Service)有点令人困惑。
以下是关于何时使用SystemService和Services的答案
服务