原文网址:http://blog.csdn.net/shenzhonglaoxu/article/details/42675287

今天在学习android的Service组件的时候,在AndroidMainfest.xml中定义了

  1. <service
  2. android:name=".BindService"
  3. android:enabled="true"
  4. android:exported="true" >
  5. <intent-filter>
  6. <action android:name="com.example.user.firstapp.FIRST_SERVICE"/>
  7. </intent-filter>
  8. </service>

然后在activity中用如下代码绑定service:

  1. final Intent intent = new Intent();
  2. intent.setAction("com.example.user.firstapp.FIRST_SERVICE");
  3. bindService(intent,coon,Service.BIND_AUTO_CREATE);

这时候会报错:

IllegalArgumentException: Service Intent must be explicit

经过查找相关资料,发现是因为Android5.0中service的intent一定要显性声明,当这样绑定的时候不会报错。

  1. final Intent intent = new Intent(this,BindService.class);
  2. bindService(intent,coon,Service.BIND_AUTO_CREATE)

http://blog.android-develop.com/2014/10/android-l-api-21-javalangillegalargumen.html上看到一个解决方法,可以将隐性调用变成显性调用。先定义一个函数:

  1. /***
  2. * Android L (lollipop, API 21) introduced a new problem when trying to invoke implicit intent,
  3. * "java.lang.IllegalArgumentException: Service Intent must be explicit"
  4. *
  5. * If you are using an implicit intent, and know only 1 target would answer this intent,
  6. * This method will help you turn the implicit intent into the explicit form.
  7. *
  8. * Inspired from SO answer: http://stackoverflow.com/a/26318757/1446466
  9. * @param context
  10. * @param implicitIntent - The original implicit intent
  11. * @return Explicit Intent created from the implicit original intent
  12. */
  13. public static Intent createExplicitFromImplicitIntent(Context context, Intent implicitIntent) {
  14. // Retrieve all services that can match the given intent
  15. PackageManager pm = context.getPackageManager();
  16. List<ResolveInfo> resolveInfo = pm.queryIntentServices(implicitIntent, 0);
  17. // Make sure only one match was found
  18. if (resolveInfo == null || resolveInfo.size() != 1) {
  19. return null;
  20. }
  21. // Get component info and create ComponentName
  22. ResolveInfo serviceInfo = resolveInfo.get(0);
  23. String packageName = serviceInfo.serviceInfo.packageName;
  24. String className = serviceInfo.serviceInfo.name;
  25. ComponentName component = new ComponentName(packageName, className);
  26. // Create a new intent. Use the old one for extras and such reuse
  27. Intent explicitIntent = new Intent(implicitIntent);
  28. // Set the component to be explicit
  29. explicitIntent.setComponent(component);
  30. return explicitIntent;
  31. }

然后调用

  1. final Intent intent = new Intent();
  2. intent.setAction("com.example.user.firstapp.FIRST_SERVICE");
  3. final Intent eintent = new Intent(createExplicitFromImplicitIntent(this,intent));
  4. bindService(eintent,conn, Service.BIND_AUTO_CREATE);

这样也可以解决问题。

PS:调用本地service是这样的,不知道其他程序隐性调用service时会不会也有类似的问题,待续。

另一种简单点的解决方法可参考另一篇日志

继续上一篇文章,今天发现了新的解决方法,在生命intent的时候同时调用setAction和setPackage方法,这样创建出来的intent就是显性的

  1. final Intent intent = new Intent();
  2. intent.setAction("com.example.user.firstapp.FIRST_SERVICE");
  3. intent.setPackage(this.getPackageName());
  4. bindService(intent,conn,Service.BIND_AUTO_CREATE);

即设置了intent的action之后还要设置service所在的包名,这里是本地调用,所以用getPackageName()方法就可以获取包名。

实测有效。

【转】Service Intent must be explicit的解决方法的更多相关文章

  1. Android Service Intent must be explicit的解决方法

    今天在学习Android的Service组件的时候,在AndroidMainfest.xml中定义了 <service android:name=".BindService" ...

  2. Service Intent must be explicit的解决方法

    今天遇到如标题问题,查阅资料:http://blog.android-develop.com/2014/10/android-l-api-21-javalangillegalargumen.html ...

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

    有些时候我们使用Service的时需要采用隐私启动的方式,但是Android 5.0一出来后,其中有个特性就是Service Intent  must be explitict,也就是说从Lollip ...

  4. java.lang.IllegalArgumentException: Service Intent must be explicit 解决办法

    java.lang.IllegalArgumentException: Service Intent must be explicit 意思是服务必须得显式的调用 我之前是这样使用绑定Service的 ...

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

    extends:http://www.eoeandroid.com/thread-568853-1-1.html 本帖最后由 469874851 于 2015-3-11 18:15 编辑 有些时候我们 ...

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

    我的Android进阶之旅-->如何解决Android 5.0中出现的警告: java.lang.IllegalArgumentException: Service Intent must be ...

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

    我的Android进阶之旅-->怎样解决Android 5.0中出现的警告: java.lang.IllegalArgumentException: Service Intent must be ...

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

    Android 5.0程序运行报Service Intent must be explicit错误,原因是5.0的service必须显式调用 改成 Intent intent = new Intent ...

  9. AIDL使用绑定启动远程Service出现Service Intent must be explicit: Intent

    Intent intent = new Intent(); intent.setAction("remote.MyRemoteService.Action"); 使用AIDL调用远 ...

随机推荐

  1. php PDO操作乱码问题

    前阶段用php写了一个小网页(每周一练),然后就一直忙着其他事也没管它,今天想着给它写个添加数据的页面,用pdo操作,没想到插入数据库的中文数据竟然乱码了,竟然乱码了!然后我就方了,赶紧检测数据传输过 ...

  2. apache shiro内置过滤器 标签 注解

    内置过滤器 anon(匿名)  org.apache.shiro.web.filter.authc.AnonymousFilter authc(身份验证)       org.apache.shiro ...

  3. [小知识] 获取浏览器UA标识

    这个随笔纯粹是小知识的积累,以后都会打上小知识的标签. 经常见的,下载移动app时,只有一个二维码,但扫码后,会根据手机是iphone还是android下载不同app,下面就是这个操作的代码: < ...

  4. UUID.randomUUID()方法介绍

    UUID.randomUUID().toString()是javaJDK提供的一个自动生成主键的方法.UUID(Universally Unique Identifier)全局唯一标识符,是指在一台机 ...

  5. HDU4662+无

    把目标中的 U 转化为 I. 又因为 I的个数是有规律的:1 2 4 8 16 ...再结合可以取消 6 12 18 ...个I...得解 #include<string.h> #incl ...

  6. ios 绘制wav波形图

    最近研究了如何在iOS上绘制wav波形图.查了很多资料,都没能找到一个很完整的介绍,我这里总结一下一些经验. 首先需要了解wav的这3个重要指标:采样率.采样位数.声道数.下面以16KHz, 16Bi ...

  7. android2.3 View视图框架源码分析之一:android是如何创建一个view的?

    View是所有控件的一个基类,无论是布局(Layout),还是控件(Widget)都是继承自View类.只不过layout是一个特殊的view,它里面创建一个view的数组可以包含其他的view而已. ...

  8. android怎样写一个循环文字滚动的TextView

    效果图: 在layout中这样来声明: <com.kaixin001.view.ScrollText android:id="@+id/news_statustxt" and ...

  9. ini文件解析c库(iniparser)

    一.交叉编译ini解析库 1.官方网站http://ndevilla.free.fr/iniparser 下载iniparser-3.1.tar.gz 2.解压 tar -zxvf iniparser ...

  10. Android -------- eclipse平台上的单元测试框架

    eclipse平台上单元测试框架 继承android.test.AndroidTestCase类 清单文件中设置 设置指令集,与application标签同级 <instrumentation ...