service intent must be explicit:intent问题的解决

Android 5.0以上不允许隐式启动服务,所以回报这个错误!

解决办法一:

将原启动方式更改为如下启动方式:

  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);  
解决办法二:

可以将隐式调用更改为显示调用,先定义一个函数:

  1.  public static Intent createExplicitFromImplicitIntent(Context context, Intent implicitIntent) {  
  2.         // Retrieve all services that can match the given intent  
  3.         PackageManager pm = context.getPackageManager();  
  4.         List<ResolveInfo> resolveInfo = pm.queryIntentServices(implicitIntent, 0);  
  5.    
  6.         // Make sure only one match was found  
  7.         if (resolveInfo == null || resolveInfo.size() != 1) {  
  8.             return null;  
  9.         }  
  10.    
  11.         // Get component info and create ComponentName  
  12.         ResolveInfo serviceInfo = resolveInfo.get(0);  
  13.         String packageName = serviceInfo.serviceInfo.packageName;  
  14.         String className = serviceInfo.serviceInfo.name;  
  15.         ComponentName component = new ComponentName(packageName, className);  
  16.    
  17.         // Create a new intent. Use the old one for extras and such reuse  
  18.         Intent explicitIntent = new Intent(implicitIntent);  
  19.    
  20.         // Set the component to be explicit  
  21.         explicitIntent.setComponent(component);  
  22.    
  23.         return explicitIntent;  
  24.     }  
       下一步:
将此函数在原调用service的地方调用即可:
  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); 


你可能感兴趣的:(android)