Android L(API 21)-java.lang.IllegalArgumentException:服务意图必须是明确的

Android L(API 21)-java.lang.IllegalArgumentException:服务意图必须是明确的,android,android-intent,android-service,android-5.0-lollipop,Android,Android Intent,Android Service,Android 5.0 Lollipop,Android的新版本——“棒棒糖”(API 21)带来了很多变化,但如果你想让你的应用程序以该API为目标,它会有一些价格 当我们开始根据新的API调整应用程序时,首先遇到的问题之一是IllegalArgumentException:服务意图必须是明确的 如果您遇到了这个问题,并且实际上打算以显式方式使用您的意图(这意味着在启动服务时,您希望正好执行一个服务操作),下面是一个将隐式-->显式转换为显式的快速修复方法: public static Intent createExplicitFro

Android的新版本——“棒棒糖”(API 21)带来了很多变化,但如果你想让你的应用程序以该API为目标,它会有一些价格

当我们开始根据新的API调整应用程序时,首先遇到的问题之一是
IllegalArgumentException:服务意图必须是明确的

如果您遇到了这个问题,并且实际上打算以显式方式使用您的意图(这意味着在启动服务时,您希望正好执行一个服务操作),下面是一个将隐式-->显式转换为显式的快速修复方法:

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;
    }
publicstaticintent createexplicitfromplicitintent(上下文上下文,Intent implicitIntent){
//检索可以匹配给定意图的所有服务
PackageManager pm=context.getPackageManager();
List resolveInfo=pm.querytentservices(隐式内容,0);
//确保只找到一个匹配项
if(resolveInfo==null | | resolveInfo.size()!=1){
返回null;
}
//获取组件信息并创建组件名称
ResolveInfo serviceInfo=ResolveInfo.get(0);
字符串packageName=serviceInfo.serviceInfo.packageName;
字符串className=serviceInfo.serviceInfo.name;
ComponentName组件=新组件名(packageName,className);
//创建一个新的意图。将旧的意图用于额外用途和重复使用
意图显式=新意图(隐含内容);
//将组件设置为显式
explicitIntent.setComponent(组件);
返回显式;
}
应该这样做。请随时发表评论,以了解有关这一新问题的更多见解。

明确启动服务 或者以隐式意图显式提供包
可以回答你自己的问题。但是把答案放在答案区域。要求明确的服务意图的全部目的是确保您实际启动了您认为自己是的服务(而不是碰巧具有相同隐式过滤器的恶意服务)。虽然这种方法解决了表面问题,但并不能解决根本问题。事实上,如果存在多个服务,则您的方法将返回
null
,这意味着您的应用可能会根据其他应用的安装/卸载时间停止工作(没有服务启动)。可能存在重复的
intent = new Intent(context, Service.class);
intent = new Intent("com.example.intent.ACTION");
intent.setPackage("com.example")