由于一个程序使用了分包,导致其他应用调用该程序的Service的时候无法直接通过包名来调用这个程序的服务,可以通过以下代码来隐式调用服务
1.定义Service
<service
android:name="com.xxx.service.DownLoadService"
android:exported="true">
<intent-filter>
<action android:name="com.xxx.service.DownLoadService" />
</intent-filter>
</service>
2.使用Service
Kotlin调用代码
val intent = Intent("com.xxx.service.DownLoadService")
val downLoadIntent = createExplicitFromImplicitIntent(this, intent)
startService(downLoadIntent);
private fun createExplicitFromImplicitIntent(context: Context, implicitIntent: Intent?): Intent? {
val pm: PackageManager = context.packageManager
val resolveInfo =
pm.queryIntentServices(implicitIntent, 0)
if (resolveInfo == null || resolveInfo.size != 1) {
return null
}
val serviceInfo = resolveInfo[0]
val packageName = serviceInfo.serviceInfo.packageName
val className = serviceInfo.serviceInfo.name
val component = ComponentName(packageName, className)
val explicitIntent = Intent(implicitIntent)
explicitIntent.component = component
return explicitIntent
}
Java调用代码
Intent intent = new Intent("com.xxx.service.DownLoadService");
Intent downLoadIntent = createExplicitFromImplicitIntent(this, intent);
startService(downLoadIntent);
public Intent createExplicitFromImplicitIntent(Context context, Intent implicitIntent) {
PackageManager pm = context.getPackageManager();
List<ResolveInfo> resolveInfo = pm.queryIntentServices(implicitIntent, 0);
if (resolveInfo == null || resolveInfo.size() != 1) {
return null;
}
ResolveInfo serviceInfo = resolveInfo.get(0);
String packageName = serviceInfo.serviceInfo.packageName;
String className = serviceInfo.serviceInfo.name;
ComponentName component = new ComponentName(packageName, className);
Intent explicitIntent = new Intent(implicitIntent);
explicitIntent.setComponent(component);
return explicitIntent;
}