How Apps Communicate with ActivityManagerService

How Apps Communicate with ActivityManagerService

Overview

Apps communicate with ActivityManagerService (AMS) through Android's Binder IPC (Inter-Process Communication) mechanism.

The document explains the complete communication flow.


Architecture Overview

App Process
Activity/Service/etc ActivityManager IActivityManager
Binder Proxy Binder Driver
Kernel ActivityManagerService
System Server IActivityManager.Stub


Key Components

1. IActivityManager.aidl - The Interface Definition

Location: [IActivityManager.aidl]

This AIDL (Android Interface Definition Language) file defines the system API for communication between apps and AMS. It contains ~200+ methods including:

  • startActivity() - Launch activities
  • startService() - Start services
  • broadcastIntent() - Send broadcasts
  • bindService() - Bind to services
  • getContentProvider() - Access content providers
  • attachApplication() - Attach app process to AMS

Example methods:

java 复制代码
interface IActivityManager {
    // Start an activity
    int startActivityWithFeature(in IApplicationThread caller, 
        in String callingPackage, in String callingFeatureId, 
        in Intent intent, ...);
    
    // Start a service
    ComponentName startService(in IApplicationThread caller, 
        in Intent service, in String resolvedType, ...);
    
    // Broadcast intent
    int broadcastIntentWithFeature(in IApplicationThread caller,
        in String callingFeatureId, in Intent intent, ...);
}

2. ActivityManager - Client Side API

Location: [ActivityManager.java]

This class provides the app-facing API and internally uses Binder to communicate with AMS.

How Apps Get AMS Reference
java 复制代码
// Line 4738-4755
public static IActivityManager getService() {
    return IActivityManagerSingleton.get();
}

private static final Singleton<IActivityManager> IActivityManagerSingleton =
    new Singleton<IActivityManager>() {
        @Override
        protected IActivityManager create() {
            // 1. Get Binder reference from ServiceManager
            final IBinder b = ServiceManager.getService(Context.ACTIVITY_SERVICE);
            
            // 2. Convert to IActivityManager proxy
            final IActivityManager am = IActivityManager.Stub.asInterface(b);
            
            return am;
        }
    };

Key Steps:

  1. ServiceManager.getService() - Retrieve Binder token for "activity" service
  2. IActivityManager.Stub.asInterface() - Create Binder proxy
  3. Singleton pattern - Cache reference for reuse

3. ActivityManagerService - Server Implementation

Location: [ActivityManagerService.java]

AMS extends IActivityManager.Stub (Binder server stub) and implements all interface methods.


Communication Flow

Example: Starting an Activity

App (Client) ActivityManager IActivityManager.Stub.Proxy Binder Driver IActivityManager.Stub ActivityManagerService startActivity(intent) getService() startActivityWithFeature(...) Parcel data transact() onTransact() startActivityWithFeature(...) Process request Return result Reply Result Result Result App (Client) ActivityManager IActivityManager.Stub.Proxy Binder Driver IActivityManager.Stub ActivityManagerService


Common Usage Patterns

Pattern 1: Direct IActivityManager Access

Used by framework classes like ActivityThread:

java 复制代码
// ActivityThread.java Line 4263
IActivityManager mgr = ActivityManager.getService();
mgr.attachApplication(mAppThread, startSeq);

Pattern 2: Through Context APIs

Apps typically use Context wrapper methods:

java 复制代码
// App code
context.startActivity(intent);
context.sendBroadcast(intent);
context.startService(intent);

// Internally in ContextImpl.java
ActivityManager.getService().broadcastIntentWithFeature(...);
ActivityManager.getService().startService(...);

Examples from Codebase

1. Activity Starting Activity

java 复制代码
// Activity.java Line 6938
IIntentSender target = ActivityManager.getService().getIntentSenderWithFeature(...);

2. Broadcasting Intent

java 复制代码
// ContextImpl.java Line 1193
ActivityManager.getService().broadcastIntentWithFeature(
    mMainThread.getApplicationThread(), 
    getAttributionTag(),
    intent, resolvedType, resultReceiver, ...);

3. Service Lifecycle

java 复制代码
// ActivityThread.java Line 4489
ActivityManager.getService().serviceDoneExecuting(
    token, SERVICE_DONE_EXECUTING_START, startId, res);

4. Content Provider Access

java 复制代码
// ActivityThread.java Line 7055
holder = ActivityManager.getService().getContentProvider(
    getApplicationThread(), auth, userId, stable);

Binder IPC Mechanism

What is Binder?

Binder is Android's custom IPC mechanism that enables:

  • Cross-process method calls
  • Object reference passing
  • Security (UID/PID verification)
  • Memory-efficient data transfer

Binder Components

Component Role Location
Binder Driver Kernel module Linux kernel
ServiceManager Service registry Native daemon
Stub Server-side skeleton AMS process
Proxy Client-side proxy App process

Data Flow

  1. App calls method on Proxy
  2. Proxy marshals parameters into Parcel
  3. Binder Driver transfers Parcel to server process
  4. Stub unmarshals Parcel
  5. Stub calls actual AMS method
  6. Result flows back through same path

Security & Permissions

UID/PID Verification

AMS verifies caller identity:

java 复制代码
int callingUid = Binder.getCallingUid();
int callingPid = Binder.getCallingPid();

Permission Checks

Many methods require permissions:

java 复制代码
// IActivityManager.aidl
@RequiresPermission(Manifest.permission.FORCE_STOP_PACKAGES)
void forceStopPackage(in String packageName, int userId);

Complete Example: App Launch Flow

1. App Code

java 复制代码
Intent intent = new Intent(this, TargetActivity.class);
startActivity(intent);

2. Activity.java

java 复制代码
public void startActivity(Intent intent) {
    startActivity(intent, null);
}

3. Instrumentation.java

java 复制代码
ActivityManager.getService().startActivityWithFeature(...);

4. Binder IPC

复制代码
[App Process] → Binder Proxy → Binder Driver → Binder Stub → [System Server]

5. ActivityManagerService

java 复制代码
public int startActivityWithFeature(...) {
    // Verify permissions
    // Create ActivityRecord
    // Start process if needed
    // Launch activity
}

Key Takeaways

  1. Apps never directly access AMS - Always through Binder IPC
  2. Single API : ActivityManager.getService() returns IActivityManager proxy
  3. AIDL defines contract between app and system server
  4. Binder handles all cross-process communication
  5. Security enforced at Binder boundary (UID/PID checks, permissions)

Common API Categories

Category Example Methods
Activity startActivity, finishActivity, moveTaskToFront
Service startService, stopService, bindService, unbindService
Broadcast broadcastIntent, registerReceiver, unregisterReceiver
Provider getContentProvider, publishContentProviders
Process attachApplication, getRunningAppProcesses, killPids
Configuration getConfiguration, updateConfiguration
System getCurrentUser, isUserRunning, shutdown
相关推荐
共享家95276 分钟前
Java入门( 异常 )
java·开发语言·php
standovon11 分钟前
SQL SERVER 登陆错误:18456
java
大傻^12 分钟前
Spring AI Alibaba 文档智能处理:PDF、Markdown知识入库全链路
java·人工智能·spring·pdf·知识图谱·springai·springaialibaba
恼书:-(空寄20 分钟前
拦截器获取不到 POST 请求 JSON 结构体参数(完整解决方案)
java·spring boot·spring·servlet
-Excalibur-29 分钟前
IP数据包在计算机网络传输的全过程
java·网络·c++·笔记·python·网络协议·智能路由器
东离与糖宝29 分钟前
JDK 26 HTTP/3原生客户端实战|高并发接口性能压测全流程
java·人工智能
番茄去哪了29 分钟前
从0到1独立开发一个论坛项目(一)
java·数据库·oracle·maven
BioRunYiXue32 分钟前
从现象到机制:蛋白降解调控研究的系统策略与实验设计
java·linux·运维·服务器·网络·人工智能·eclipse
希望永不加班33 分钟前
如何在 SpringBoot 里自定义 Spring MVC 配置
java·spring boot·后端·spring·mvc
weixin1997010801634 分钟前
“迷你京东”全栈架构设计与实现
java·大数据·python·数据库架构