如何解决Android 5.0中出现的警告:Service Intent must be expli

有些时候我们使用Service的时需要采用隐私启动的方式,但是Android 5.0一出来后,其中有个特性就是Service Intent  must be explitict,也就是说从Lollipop开始,service服务必须采用显示方式启动。

而android源码是这样写的(源码位置:sdk/sources/android-21/android/app/ContextImpl.java):

  1. private void validateServiceIntent(Intent service) {
  2. if (service.getComponent() == null && service.getPackage() == null) {
  3. if (getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.LOLLIPOP) {
  4. IllegalArgumentException ex = new IllegalArgumentException(
  5. "Service Intent must be explicit: " + service);
  6. throw ex;
  7. } else {
  8. Log.w(TAG, "Implicit intents with startService are not safe: " + service
  9. + " " + Debug.getCallers(2, 3));
  10. }
  11. }
  12. }

复制代码

既然,源码里是这样写的,那么这里有两种解决方法:

1、设置Action和packageName:

参考代码如下:

  1. Intent mIntent = new Intent();
  2. mIntent.setAction("XXX.XXX.XXX");//你定义的service的action
  3. mIntent.setPackage(getPackageName());//这里你需要设置你应用的包名
  4. context.startService(mIntent);

复制代码

此方式是google官方推荐使用的解决方法。

在此附上地址供大家参考:http://developer.android.com/goo ... tml#billing-service,有兴趣的可以去看看。

2、将隐式启动转换为显示启动:
--参考地址:
http://stackoverflow.com/a/26318757/1446466

  1. public static Intent getExplicitIntent(Context context, Intent implicitIntent) {
  2. // Retrieve all services that can match the given intent
  3. PackageManager pm = context.getPackageManager();
  4. List<ResolveInfo> resolveInfo = pm.queryIntentServices(implicitIntent, 0);
  5. // Make sure only one match was found
  6. if (resolveInfo == null || resolveInfo.size() != 1) {
  7. return null;
  8. }
  9. // Get component info and create ComponentName
  10. ResolveInfo serviceInfo = resolveInfo.get(0);
  11. String packageName = serviceInfo.serviceInfo.packageName;
  12. String className = serviceInfo.serviceInfo.name;
  13. ComponentName component = new ComponentName(packageName, className);
  14. // Create a new intent. Use the old one for extras and such reuse
  15. Intent explicitIntent = new Intent(implicitIntent);
  16. // Set the component to be explicit
  17. explicitIntent.setComponent(component);
  18. return explicitIntent;
  19. }

就是使用上面这段代码解决了出错的问题

复制代码

调用方式如下:

  1. Intent mIntent = new Intent();
  2. mIntent.setAction("XXX.XXX.XXX");
  3. Intent eintent = new Intent(getExplicitIntent(mContext,mIntent));
  4. context.startService(eintent);

复制代码

上述是eoe上看到的解决方案,而当时我是在用AIDL的service,测试了两种方式,第一种在添加setpackage这句代码后提示AIDL的service的绑定失败,第二种方式解决了出现的异常问题,如果有更好的解决方法希望能留言或者私信我,以便学习知识更新博文

时间: 2024-10-08 18:52:19

如何解决Android 5.0中出现的警告:Service Intent must be expli的相关文章

我的Android进阶之旅------&gt;如何解决Android 5.0中出现的警告: Service Intent must be explicit:

1.错误描述 今天在Android4.4 的小米4手机上运行我的程序的时候没有报错,而在Android 5.1的华为P7上运行我的程序的时候报了以下的错误,错误提示如下: E/AndroidRuntime(12500): FATAL EXCEPTION: main E/AndroidRuntime(12500): Process: com.xtc.watch, PID: 12500 E/AndroidRuntime(12500): java.lang.IllegalArgumentExcepti

解决Android 5.0中出现的警告:Service Intent must be explicit

extends:http://www.eoeandroid.com/thread-568853-1-1.html 本帖最后由 469874851 于 2015-3-11 18:15 编辑 有些时候我们使用Service的时需要采用隐私启动的方式,但是Android 5.0一出来后,其中有个特性就是Service Intent  must be explitict,也就是说从Lollipop开始,service服务必须采用显示方式启动.而android源码是这样写的(源码位置:sdk/source

[Android分享] 如何解决Android 5.0中出现的警告:Service Intent must be explicit

Android 5.0程序运行报Service Intent must be explicit错误,原因是5.0的service必须显式调用 改成 Intent intent = new Intent(mContext, IService.class); 或者Intent intent = new Intent(): intent.setclass(xx.xx,xx.xx): 网上说的如下方式是不可行的: Intent intent = new Intent("com.xx.xx.Service

如何解决Android 5.0中出现的警告:Service Intent must be explicit

从Lollipop开始,service服务必须采用显示方式启动. Intent intent = new Intent("a.b.c");intent.setPackage(getPackageName());startService(intent);

解决android studio项目中Failded to sync Gradle project &#39;XXXX&#39; Cause:failed to find target with hash string &#39;android-16&#39;问题

之前在github上通过import module导入一个项目,结果报错,提示找不到sdk相应的版本xx,而我的compileSdkVersion明明写的是23不是xx,查了半天也没解决.最后只好下载了那个版本的sdk. 今天导入SlidingMenu的module的时候,又遇到了这个问题.  问题: Cause:failed to find target with hash string 'android-16' in: E:\sony\Android\sdk failed to find B

在Android 5.0中使用JobScheduler

在Android 5.0中使用JobScheduler 原文链接 : using-the-jobscheduler-api-on-android-lollipop 译者 : Mr.Simple 校对者 : Mr.Simple 在这篇文章中,你会学习到在Android 5.0中如何使用JobScheduler API.JobScheduler API允许开发者在符合某些条件时创建执行在后台的任务. 介绍 在Android开发中,会存在这么些场景 : 你需要在稍后的某个时间点或者当满足某个特定的条件

Android 6.0 中动态获取权限

Android 5.0时代,用户可以在设置选项中对每个授权许可进行开启/关闭 Android 6.0 Marshmallow中,在首次打开.使用过程中实际用到哪些权限才会向收到申请授权的提醒,和现在的iOS非常相像. 参考:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0830/3387.html 需求:做一个定位功能的软件 checkSelfPermission 检查是否具有权限 requestPermissions; 请

另辟思路解决 Android 4.0.4 不能监听Home键的问题

问题描述: 自从Android 4.0以后,开发人员是不能监听和屏蔽Home键的,对于KEYCODE_HOME,官方给出的描述如下: Home key. This key is handled by the framework and is never delivered to applications. 所以,除非修改Framework,都不能直接监听Home键了,网上有朋友说监听Log日志,但是现在按Home键是不显示Log日志的,而且不同的手机型号即使显示也不会一样. 在网上找了好多方法都

解决Android 6.0获取wifi Mac地址为02:00:00:00:00:00问题【转】

本文转载自:http://www.jb51.net/article/128398.htm 这篇文章主要介绍了Android 6.0获取wifi Mac地址为02:00:00:00:00:00的解决方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下 前言: 之前项目比较旧,手机版本还比较低,还使用eclipse开发.用到了需要获取手机wifi Mac地址.使用了如下代码: // Android 6.0之前的版本可以用的方法(模拟器可以使用) private String getMacAddrO