做的比较好的p2p网站,大连网站网络公司,小型手机网站建设,宜宾市住房和城乡建设局网站今天在Android11上发现了一个的问题#xff0c;如果目标Service的进程没有启动#xff0c;那么无论是bindService还是startService都没有办法拉起指定的Service。 网上查了很多资料如下: 1.目标Service 设置 android:exportedtrue 2.目标Service需要声明自定义权…今天在Android11上发现了一个的问题如果目标Service的进程没有启动那么无论是bindService还是startService都没有办法拉起指定的Service。 网上查了很多资料如下: 1.目标Service 设置 android:exportedtrue 2.目标Service需要声明自定义权限。客户端需要声明权限。 3.目标Service需要添加intent-filter/intent-filter
上面的方法都试过了**然并卵**还是报Unable to start service Intent. 实在没办法去翻了下源码在startService中过程中当调用调用pms去解析intent是返回null会打印这个日志。代码片段如下
ActiveServices # retrieveServiceLocked ResolveInfo rInfo mAm.getPackageManagerInternalLocked().resolveService(service,resolvedType, flags, userId, callingUid);ServiceInfo sInfo rInfo ! null ? rInfo.serviceInfo : null;if (sInfo null) {Slog.w(TAG_SERVICE, Unable to start service service U userId : not found);return null;} //....代码省略
PackageManagerService # resolveServiceInternalprivate ResolveInfo resolveServiceInternal(Intent intent, String resolvedType, int flags,int userId, int callingUid) {if (!mUserManager.exists(userId)) return null;flags updateFlagsForResolve(flags, userId, callingUid, false /*includeInstantApps*/,false /* isImplicitImageCaptureIntentAndNotSetByDpc */);ListResolveInfo query queryIntentServicesInternal(intent, resolvedType, flags, userId, callingUid, false /*includeInstantApps*/);if (query ! null) {if (query.size() 1) {// If there is more than one service with the same priority,// just arbitrarily pick the first one.return query.get(0);}}return null;} 看到上面源码吓的我赶紧搜了搜Android11 resolveIntent返回null的问题 果然不出所料Android 11引入了*包可见性* 为啥引入包可见性呢 Goole给出的原因 1.鼓励最小权限原则需要与那些应用交互就申请那些包名。 2.帮助 Google Play 等应用商店评估应用的隐私性和安全性。、
好啦知道了前因后果那么我们来解决问题吧
Solve方案 方案一
queries//你要交互的service的包名package android:namecom.XXX.XXX ///...等等包名
/queries 方案二
uses-permission android:nameandroid.permission.QUERY_ALL_PACKAGES/ 配置完了赶紧拿起手机试了试重启手机bind目标service终于bind成功了 上面的包可见性问题不仅Service有这个问题Activity也有这么问题哈记录一下避免有朋友也遇到同样的问题。