Android13 Service startForeground流程分析

Service的startForeground用于将服务设置为前台服务,代码如下:

//frameworks/base/core/java/android/app/Service.java
public abstract class Service extends ContextWrapper implements ComponentCallbacks2,
        ContentCaptureManager.ContentCaptureClient {
    private IActivityManager mActivityManager = null;
    public final void startForeground(int id, Notification notification) {
        try {
            mActivityManager.setServiceForeground(
                    new ComponentName(this, mClassName), mToken, id,
                    notification, 0, FOREGROUND_SERVICE_TYPE_MANIFEST);
            clearStartForegroundServiceStackTrace();
        } catch (RemoteException ex) {
        }
    }
}

上面方法主要处理如下:

1、调用IActivityManager的setServiceForeground方法。

2、调用clearStartForegroundServiceStackTrace方法。

下面分别进行分析:

ActivityManagerService setServiceForeground

调用IActivityManager的setServiceForeground方法,IActivityManager是一个接口,ActivityManagerService实现了这个接口。

待补充

clearStartForegroundServiceStackTrace

调用clearStartForegroundServiceStackTrace方法:

//frameworks/base/core/java/android/app/Service.java
public abstract class Service extends ContextWrapper implements ComponentCallbacks2,
        ContentCaptureManager.ContentCaptureClient {
    private static final ArrayMap<String, StackTrace> sStartForegroundServiceStackTraces =
            new ArrayMap<>();
    private void clearStartForegroundServiceStackTrace() {
        synchronized (sStartForegroundServiceStackTraces) {
            sStartForegroundServiceStackTraces.remove(this.getClassName()); //删除启动前台服务堆栈跟踪
        }
    }
}
根据提供的引用内容,当使用`Context.startForegroundService()`启动服务后,必须在服务的`onCreate()`方法中调用`Service.startForeground()`方法,否则会报错`android.app.RemoteServiceException: Context.startForegroundService() did not then call Service.startForeground()`。这是因为在Android O(API级别26)及更高版本中,启动前台服务需要调用`startForeground()`方法来显示通知,以确保服务在后台运行时不会被系统杀死。 以下是一个示例代码,演示如何正确使用`Service.startForeground()`方法: ```java public class MyService extends Service { private static final int NOTIFICATION_ID = 1; @Override public void onCreate() { super.onCreate(); // 创建通知 Notification notification = new Notification.Builder(this) .setContentTitle("Foreground Service") .setContentText("Service is running in the foreground") .setSmallIcon(R.drawable.ic_notification) .build(); // 将服务设置为前台服务 startForeground(NOTIFICATION_ID, notification); } @Override public int onStartCommand(Intent intent, int flags, int startId) { // 执行服务的逻辑操作 return START_STICKY; } @Override public void onDestroy() { super.onDestroy(); // 停止前台服务 stopForeground(true); } @Nullable @Override public IBinder onBind(Intent intent) { return null; } } ``` 在上述示例中,我们在服务的`onCreate()`方法中创建了一个通知,并调用`startForeground()`方法将服务设置为前台服务。在服务的`onDestroy()`方法中,我们调用`stopForeground(true)`方法停止前台服务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值