Android如何实现跨应用独立进程远程服务的开发与调用
Android 双应用跨进程启动Service实现方案
1. 服务端App(仅含Service的独立应用)配置
首先在服务端App的AndroidManifest.xml中声明Service,设置对外开放权限,同时添加自定义Action供客户端调用:
<service android:name=".IsolatedSdkService" android:exported="true"> <intent-filter> <!-- 自定义Action,需和客户端调用时保持一致 --> <action android:name="com.example.isolatedservice.START_SDK_SERVICE" /> </intent-filter> </service>
然后编写Service代码,在内部初始化你需要的SDK实例即可,该实例和客户端App的SDK实例完全隔离:
public class IsolatedSdkService extends Service { // 隔离进程中的SDK独立实例 private YourTargetSdk isolatedSdkInstance; @Nullable @Override public IBinder onBind(Intent intent) { // 不需要跨进程双向通信可直接返回null,有通信需求可实现AIDL接口 return null; } @Override public void onCreate() { super.onCreate(); // 此处初始化的SDK与客户端Activity中的SDK内存完全独立,状态互不影响 isolatedSdkInstance = YourTargetSdk.getInstance(); isolatedSdkInstance.init(getApplicationContext(), "服务端专属SDK配置参数"); } @Override public int onStartCommand(Intent intent, int flags, int startId) { // 可接收客户端传递的参数执行对应SDK操作 return START_STICKY; } }
注意:Android 8.0及以上系统要求前台服务启动后5秒内调用startForeground()展示常驻通知,否则会触发ANR,服务端Service需要新增对应逻辑。
2. 客户端App(含Activity的应用)调用实现
首先处理版本兼容:Android 11(API 30)及以上系统做了包可见性限制,需要在客户端AndroidManifest.xml的根节点下新增queries声明,否则无法找到服务端的Service:
<queries> <intent> <action android:name="com.example.isolatedservice.START_SDK_SERVICE" /> </intent> </queries>
在Activity中添加启动服务端Service的代码,将隐式Intent转为显式调用避免兼容问题:
// 该方法可绑定到Activity的按钮点击事件,或在需要启动服务时调用 private void launchIsolatedService() { Intent serviceIntent = new Intent("com.example.isolatedservice.START_SDK_SERVICE"); // 替换为服务端App的实际包名,将隐式Intent转为显式 serviceIntent.setPackage("com.example.isolatedservice"); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { startForegroundService(serviceIntent); } else { startService(serviceIntent); } }
3. 额外说明
- 两个应用签名无需保持一致,只要服务端Service的
exported属性设为true即可正常跨应用调用 - 双应用属于完全独立的进程,内存空间不共享,SDK的单例状态、静态变量、缓存数据完全分离,满足创建两个独立SDK实例的需求
- 如需双向调用SDK接口、传递复杂数据,可通过AIDL实现跨进程通信,现有启动逻辑无需改动
内容的提问来源于stack exchange,提问作者newstudent
相关产品推荐
相关产品推荐

