原文网址: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. Contest - 第10届“新秀杯”ACM程序设计大赛现场热身赛 赛后信息(题解)

      Problem Id Title   Problem A A+B   Problem B 统计字数   Problem C 生日计算   Problem D 冬瓜的寒假之旅 Problem A(略 ...

  2. 玩转docker

    开篇先论赌 (组词,赌博,....),时刻,每天都在赌! 何为赌?仁者见仁,智者必定又有一番见解,保持沉默,意见保留; ——改变思维模式,Ruiy让赌赢在“思维”!!!; 存在在IT界Ruiy定格,即 ...

  3. ORA-00314,redolog 损坏,或丢失处理方法

    alertsid.log报错信息: Fri Sep 27 15:18:39 2013 Started redo scan Fri Sep 27 15:18:39 2013 Errors in file ...

  4. [原创]Python入门到简单网站目录扫描器编写(上)

    1.字符串,整型,浮点型.区别以及用法 |------字符串是 Python 中最常用的数据类型.我们可以使用引号('或")来创建字符串. 可以不严格的说,你可以认为引号包括的,都属于字符串 ...

  5. [置顶] Android的IPC访问控制设计与实现

    3.3.1 IPC钩子函数设计与实现 IPC Binder是Android最重要的进程间通信机制,因此,必须在此实施强制访问控制. 1. 修改secuirty.h 打开终端shell,输入指令“cd ...

  6. python数据库做成邮箱的注册系统!

    #! /usr/bin/env python2.7 # -*- coding:utf-8 -*- #File:w7.py #Date:2013-7-18 #Author:wangyu import r ...

  7. 内部类之.this&&.new

    一..this 我们都知道this是指当前类中的对象本身,但是在内部类中需要指明外部类时,this不再起作用,那应该怎么做呢?下面,让我们看看: public class DotThis { void ...

  8. 服务 Service 基本介绍

    Activity public class MainActivity extends ListActivity {     private boolean flag;//是否开启线程     publ ...

  9. 【转】asp.net 利用Global.asax 捕获整个解决方案中的异常错误

    之前做项目的时候都是在每个页面中处理这不同的异常信息,一个页面数下来,很多个try{}catch{}语句块,令整个代码结构有些不够美观. 今天看到一篇帖子,是关于利用全局应用程序类来帮忙获取异常信息, ...

  10. C#利用ODP.NET往oracle中高效插入百万数据

    由于工作的原因,要使用winform来处理大量的数据,但是c#自带的System.data.OracleClient效率不是很高,在网上找了很久,找到了ODP.NET,是oracle为c#提供的.貌似 ...