会员登录 - 用户注册 - 设为首页 - 加入收藏 - 网站地图 57自学网———旗下安卓自学网站专注Android系统开发教程!
当前位置:主页 > 软件开发 > 安卓开发 > 正文

android5.0之后版本服务出现的显示问题解决方案

时间:2017-06-07 21:49 来源:网络整理 作者:安卓自学网 阅读:

Android系统升级到5.0之后做了不少的变化(5.0变化),开发人员一定要注意这些变化,要不然就有的折腾了。这次最大的变化应该是把Dalvik虚拟机改成了ART运行时),后续会专门讲解这一块。其他的都是一些零碎的问题,例如前段时间发了一篇Android 5.0之后修改了HashMap的实现(传送门)。这篇主要讲一下遇到跟服务相关的问题。

二。详情

服务身为Android四大组件之一,它的使用频率还是比较高的,并且现在主要都是运用在比较关键的部位,例如升级推送等。在Android 5.0之后google出于安全的角度禁止了隐式声明意图来启动服务。也禁止使用Intent过滤器。否则就会抛出异常出来。

解决方式一:

1 将隐式启动转换为显式启动,兼容编译sdk5.0以后版本//将隐式启动转换为显式启动,兼容编译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;
}

复制以上方法

直接使用

//设别服务连接桥
private ServiceConnection conn = new ServiceConnection(){
@Override
public void onServiceConnected(ComponentName name, IBinder serviceBinder) {
LogUtils.d("aidlService服务连接成功");
if(serviceBinder != null){ //绑定成功
AidlDeviceService serviceManager = AidlDeviceService.Stub.asInterface(serviceBinder);
onDeviceConnected(serviceManager);
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
LogUtils.d("AidlService服务断开了");
}
};

//绑定服务
public void bindService(){

BaseMainActivity.this.bindService(getExplicitIntent(this,new Intent(LKL_SERVICE_ACTION)),
conn, Context.BIND_AUTO_CREATE);

//5.0以后的版本会抛出异常方法已被淘汰
// Intent intent = new Intent();
// intent.setAction(LKL_SERVICE_ACTION);
// intent.setPackage("");
// boolean flag = bindService(intent, conn, Context.BIND_AUTO_CREATE);
// if(flag){
// LogUtils.d("服务绑定成功");
// }else{
// LogUtils.d("服务绑定失败");
// }

}




解决方式二:直接写上包名和标示


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);

判断应用是否安装的方法:

复制代码

//判断应用是否安装 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; }

(责任编辑:www.57zxw.com)

顶一下
(0)
0%
踩一下
(0)
0%