原文网址: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. HER COFFEE夜场代金券【1折】_北京美食团购_360团购导航

    HER COFFEE夜场代金券[1折]_北京美食团购_360团购导航 HER COFFEE夜场代金券

  2. Nmon 监控 Linux 的系统性能

    Nmon(得名于 Nigel 的监控器)是IBM的员工 Nigel Griffiths 为 AIX 和 Linux 系统开发的一款计算机性能系统监控工具.Nmon 可以把操作系统的统计数据展示在屏幕上 ...

  3. 自己写的Ext树,Ext3.4,静态全部加载

    var load = function(){ /** * 书籍资料目录 */ var bookIT = new Ext.tree.TreeNode({ text:"IT", lea ...

  4. MVC 4.0语法 自动分页

    4.0语法中实现自动分页只需要两个方法即可,Skip() ----跳过序列中指定的元素,Take()-----从序列的开头返回指定数量元素. 一般用自动分页都是无刷新的,可以把显示的数据,用局部页面封 ...

  5. AngularJs学习笔记5——自定义服务

    前面整理了AngularJs双向数据绑定和自定义指令的相关内容,从手册上看也知道,ng部分还包括过滤器和函数,以及服务等. 过滤器:filter,就是对数据进行格式化,注意管道格式,例如: {{表达式 ...

  6. 为什么class中属性以空格分隔?

    1 div.contain .blue{color:blue;}/*后代选择器*/2 div.contain.blue{color:blue;} /*多类选择器*/ 以上两种规则分别应用的元素如下: ...

  7. Xcode简易基础篇,以新手角度去操作

    声明:此Newlife XCode非Mac的XCode,避免误会. 日常用的Newlife X组件的相关资源,不限于XCode,只是以XCode组件为主: 1.QQ群:1600800 2.博客 : h ...

  8. Path对象

    Path是连续的Segment的集合,除了 Path 的第一个Segment和最后一个Segment外,其余的Segment的起始点都是前一个Segment的终止点,即Path对象的中的Segment ...

  9. 打破C++ Const 的规则

    从一个C++菜鸟改函数开始 CString MyClass::GetStringValue() const { return m_strValue; } 这个值可能还没有赋值,好吧,那么我先判断是不是 ...

  10. C/C++语言中const的用法

    1. const 在C和C++中的区别     C++中的const正常情况下是看成编译期的常量,编译器并不为const分配空间,只是在编译的时候将期值保存在名字表中,并在适当的时候折合在代码中. 所 ...