Service

来源:互联网 发布:会计网络继续教育东奥 编辑:程序博客网 时间:2024/06/01 08:50

1、 启动方式:startServicebindService

2、 startService启动方式:
①调用者与服务之间没有任何关联,调用者退出而没有调用stopService的话,Service会一直在后台运行;
②如果调用前服务没有被创建,则会执行onCreate à onStart;如果已经被创建,即便多次调用startService方法,onCreate也仅仅执行一次而onStart则会执行多次;
③只有调用stopService方法才能结束服务,ServiceonDestroy会执行;

3、 bindService启动方式:
①调用者与服务绑定在一起,调用者一旦退出,服务也自动终止;
②如果调用前服务没有被创建,则onCreate  à  onBind方法;
如果已被创建但没有绑定,则执行onBind
如果已被绑定,则多次调用bindService并不会引起onCreateonBind被多次调用;
③调用者退出,系统会自动调用服务的onUnbind à onDestroy
如果调用者希望与正在绑定的服务解除绑定,可以调用unbindService方法,该方法会导致服务会调用onUnbind  à  onDestroy方法

4、 混合启动:
①如果第一次调用startService,系统会onCreate  à  onStart,此时调用bindService,只会调用onBind方法,如果第一次调用bindService,系统会onCreateà onBind,此时调用startService只会onStart
②一旦绑定服务,不管是先bind还是先start,就必须调用unbindServicestopService才能终止服务;

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的包名是否拥有权限来绑定该服务

 

安全性考虑的话,参考piduid


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的相关信息

 


0 0
原创粉丝点击