Service Intent must be explicit的解决方法

简介: 今天遇到如标题问题,查阅资料:http://blog.android-develop.com/2014/10/android-l-api-21-javalangillegalargumen.html /*** * Android L (lollipop, API 21) introdu...

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

 /***
     * Android L (lollipop, API 21) introduced a new problem when trying to invoke implicit intent,
     * "java.lang.IllegalArgumentException: Service Intent must be explicit"
     *
     * If you are using an implicit intent, and know only 1 target would answer this intent,
     * This method will help you turn the implicit intent into the explicit form.
     *
     * Inspired from SO answer: http://stackoverflow.com/a/26318757/1446466
     * @param context
     * @param implicitIntent - The original implicit intent
     * @return Explicit Intent created from the implicit original intent
     */
    public static Intent createExplicitFromImplicitIntent(Context context, Intent implicitIntent) {
        // Retrieve all services that can match the given intent
        PackageManager pm = context.getPackageManager();
        List<ResolveInfo> resolveInfo = pm.queryIntentServices(implicitIntent, 0);

        // Make sure only one match was found
        if (resolveInfo == null || resolveInfo.size() != 1) {
            return null;
        }

        // Get component info and create ComponentName
        ResolveInfo serviceInfo = resolveInfo.get(0);
        String packageName = serviceInfo.serviceInfo.packageName;
        String className = serviceInfo.serviceInfo.name;
        ComponentName component = new ComponentName(packageName, className);

        // Create a new intent. Use the old one for extras and such reuse
        Intent explicitIntent = new Intent(implicitIntent);

        // Set the component to be explicit
        explicitIntent.setComponent(component);

        return explicitIntent;
    }

一个转换方法,如下方法调用:

1 private void startMyIntentService() {
2         Intent startServiceIntent = new Intent("com.soyoungboy.intentservice");
3         Bundle bundle = new Bundle();
4         bundle.putString("param", "oper1");
5         startServiceIntent.putExtras(bundle);
6         startService(createExplicitFromImplicitIntent(this,startServiceIntent));
7     }

就可以了

相关文章
|
Shell Android开发
理解adb错误:Can‘t find service: android.service.gatekeeper.IGateKeeperService
理解adb错误:Can‘t find service: android.service.gatekeeper.IGateKeeperService
理解adb错误:Can‘t find service: android.service.gatekeeper.IGateKeeperService
|
Android开发
Android四大组件之一服务(Service)
Service作为Android必不可少的组件,大家有兴趣可以来看看
263 0
|
Android开发
Android四大组件之Service(二)
本篇讲使用bindService方法启动Service
|
Android开发
Android四大组件之Service(一)
Service是Android四大组件之一,它可以在后台执行长时间运行操作而没有用户界面的应用组件。
220 0
|
Java
Preference跳转activity出错Unable to find explicit activity class
使用Preference可以非常方便的实现类似设置页面这样的菜单布局,甚至可以不需写java代码。那么可以在Preference中直接添加页面跳转么?其实非常简单,在Preference添加intent标签即可
522 0
|
开发工具 Android开发
如何解决Android 5.0中出现的警告:Service Intent must be explicit
如何解决Android 5.0中出现的警告:Service Intent must be explicit
使用kbmmw smart service 属性时的一个注意事项
kbmmw 5.0 以后支持smart service, 这个用起来非常方便,kbmmw 通过 定制属性来简化编程,可以参考我以前的文章。但是这个意味着使用单元引用一定要小心, 否则出了问题,都不知道怎么回事?浪费大量的时间。
1379 0
|
安全 定位技术 Android开发