android 5.0以上不支持隱式啟動服務,有常用的兩種解決辦法。
1 將隱式啟動轉換為顯式啟動,兼容編譯sdk5.0以后版本
示例調用:
context.bindService(getExplicitIntent(mContext,new Intent(GPSBOARDCONTROL)), serviceConnection, Context.BIND_AUTO_CREATE);
轉換代碼
//將隱式啟動轉換為顯式啟動,兼容編譯sdk5.0以后版本 public Intent getExplicitIntent(Context context,Intent implicitIntent){ PackageManager pm = context.getPackageManager(); List<ResolveInfo> resolveInfos = pm.queryIntentServices(implicitIntent, 0); if (resolveInfos == null || resolveInfos.size()!= 1) { return null; } Intent explicitIntent = null; ResolveInfo info = resolveInfos.get(0); String packageName = info.serviceInfo.packageName; String className = info.serviceInfo.name; ComponentName component = new ComponentName(packageName,className); explicitIntent = new Intent(implicitIntent); explicitIntent.setComponent(component); return explicitIntent; }
2 直接寫上包名以及標志
Intent intent = new Intent("com.gnss.GNSSService"); intent.setAction(GPSBOARDCONTROL);//Service能夠匹配的Action intent.setPackage("com.gnss.ssserver");//應用的包名 context.bindService(intent,serviceConnection, Context.BIND_AUTO_CREATE);
3 判斷應用是否安裝
//判斷應用是否安裝 public boolean isAppInstalled(Context context, String packageName) { final PackageManager packageManager = context.getPackageManager(); List<PackageInfo> pinfo = packageManager.getInstalledPackages(0); if (pinfo != null) { for (int i = 0; i < pinfo.size(); i++) { if (pinfo.get(i).packageName.contains(packageName)) { return true; } } } return false; }