android5.0之后不允许使用隐式Intent启动Service

来源:互联网 发布:usb转网络接口装驱动 编辑:程序博客网 时间:2024/06/05 02:43

android5.0以后不能使用隐式intent启动Service,即不允许只设置action的方式来启动service:

// 实例化Intent  Intent it = new Intent();  //设置Intent的Action属性  it.setAction("com.android.activity.MY_ACTION");  // 启动Activity  startActivity(it);   

需要指定Intent的ComponentName信息:intent.setComponent(xxx),或指定Intent的setPackage(“包名”),如果两者都没有指定的话将会报以上错误。尤其在framework层启动APP层的service时,如果是隐式启动service,可能会导致系统进程挂掉,出现不断重启的现象。

那么解决方法可以分为以下几种:

有包名和Service类名:

Intent intent = new Intent();ComponentName componentName = new ComponentName(pkgName,serviceName);intent.setComponent(componentName);context.startService(intent);

有包名,并且有Service设置的intent-filter中的action:

Intent mIntent = new Intent();mIntent.setAction("XXX.XXX.XXX");//Service能够匹配的ActionmIntent.setPackage(pkgName);//应用的包名context.startService(mIntent);......<intent-filter>  <action android:name="android.intent.action.TestAIDLService"/>  <category android:name="android.intent.category.DEFAULT"/></intent-filter>

只有intent-filter的action属性:

public static Intent getTempIntent(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;    }......Intent intent = new Intent();intent.setAction("android.intent.action.TestAIDLService");Intent eintent = new Intent(getTempIntent(this,intent));bindService(eintent,mConnection,Context.BIND_AUTO_CREATE);
阅读全文
1 0