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
相关推荐
小旭95272 分钟前
Spring Security 实现权限控制(认证 + 授权全流程)
java·后端·spring
金銀銅鐵8 分钟前
[Java] 如何通过 cglib 的 FastClass 调用一个类中的“任意”方法?
java·后端
阿维的博客日记27 分钟前
为什么会增加TreeMap和TreeSet这两类,有什么核心优势吗?可以解决什么核心痛点?
java·treeset·treemap
dllxhcjla35 分钟前
黑马头条1
java
宠友信息39 分钟前
一套基于uniapp+springboot完整社区系统是如何实现的?友猫社区源码级功能解析
java·spring boot·后端·微服务·微信·uni-app
humors2211 小时前
各厂商工具包网址
java·数据库·python·华为·sdk·苹果·工具包
无限进步_1 小时前
【C++&string】大数相乘算法详解:从字符串加法到乘法实现
java·开发语言·c++·git·算法·github·visual studio
海兰1 小时前
使用 Spring AI 打造企业级 RAG 知识库第二部分:AI 实战
java·人工智能·spring
历程里程碑2 小时前
二叉树---二叉树的中序遍历
java·大数据·开发语言·elasticsearch·链表·搜索引擎·lua
小信丶2 小时前
Spring Cloud Stream EnableBinding注解详解:定义、应用场景与示例代码
java·spring boot·后端·spring