Service
来源:互联网 发布:会计网络继续教育东奥 编辑:程序博客网 时间:2024/06/01 08:50
1、 启动方式:startService、bindService
2、 startService启动方式:
①调用者与服务之间没有任何关联,调用者退出而没有调用stopService的话,Service会一直在后台运行;
②如果调用前服务没有被创建,则会执行onCreate à onStart;如果已经被创建,即便多次调用startService方法,onCreate也仅仅执行一次而onStart则会执行多次;
③只有调用stopService方法才能结束服务,Service的onDestroy会执行;
3、 bindService启动方式:
①调用者与服务绑定在一起,调用者一旦退出,服务也自动终止;
②如果调用前服务没有被创建,则onCreate à onBind方法;
如果已被创建但没有绑定,则执行onBind
如果已被绑定,则多次调用bindService并不会引起onCreate和onBind被多次调用;
③调用者退出,系统会自动调用服务的onUnbind à onDestroy;
如果调用者希望与正在绑定的服务解除绑定,可以调用unbindService方法,该方法会导致服务会调用onUnbind à onDestroy方法
4、 混合启动:
①如果第一次调用startService,系统会onCreate à onStart,此时调用bindService,只会调用onBind方法,如果第一次调用bindService,系统会onCreateà onBind,此时调用startService只会onStart
②一旦绑定服务,不管是先bind还是先start,就必须调用unbindService再stopService才能终止服务;
5、 服务开发:①继承Service组件;②在清单文件进行配置;
6、 远程服务:
①准备AIDL文件:该文件会在gen目录下生成对应路径的Java文件,而该Java文件就是onBind中返回对象的父类,这样在第三方APP上就可以有父类对象进行接收;
②自己继承XXX.Stub类,第三方则XXX = XXX.Stub.asInterface(IBinder对象)
7、 远程服务安全性:
第一步:获取第三方APP签名
PackageManager pm = Context.getPackageManager();
List<PackageInfo> apps = pm.getInstalledPackages(PackageManager.GET_SIGNATURES);
Iterator<PackageInfo> iter = apps.iterator();
PackageInfo packageinfo = null;
while(iter.hasNext()){
packageinfo = iter.next();
if(packageinfo.applicationInfo.uid == Binder.getCallingUid())
Signature[] signatures = packageinfo.signatures;
if(signatures != null)
return signatures[0].toCharsString();
}
return null;
第二步:从远程数据库来获取该APP对应的签名
第三步:如果签名一致,则从远程服务器中校验第三方APP的包名是否拥有权限来绑定该服务
安全性考虑的话,参考pid和uid
Service Intent must be explitict
从Android5.0开始,服务必须采用显示方式启动
PackageManager pm = context.getPackageManager();
List<ResolveInfo> resolveInfo = pm.queryIntentService(intent,0);
If(resolveInfo == null || resolveInfo.size() == 0){
Return null;
}
ResolveInfo serviceInfo = resolveInfo.get(0);
String packageName = serviceInfo.serviceInfo.packageName;
String className = serviceInfo.serviceInfo.name;
ComponentName component = new ComponentName(packageName,className);
Intent explicitInent = new Intent(intent);
explicitIntent.setComponent(component);
return explicitent;
返回的explicitIntent来去启动Service
而传进来的intent则先setAction从而去查询Service的相关信息
- Service
- Service
- service
- Service
- service
- Service
- Service
- service
- Service
- Service
- Service
- service
- service
- Service
- Service
- Service
- Service
- Service
- java设计模式系列之观察者模式
- cordova项目多个原生界面间过场动画配置
- 百宝云注册码自动发卡流程
- @available 和 #available
- 如何优化JAVA代码及提高执行效率
- Service
- 欧拉工程第1题 找出1000以下自然数中3和5的倍数之和
- android Dialog
- HTTP 方法:GET 对比 POST
- IntentService
- C#版 Socket编程(最简单的Socket通信功能)
- 浅谈yarn的调度模式
- spring mvc与mybatis与maven+mysql框架整合
- SAP MM 评估类型 评估类别