您的位置:首页 > 移动开发 > Android开发

android服务

2020-02-17 04:52 489 查看

1、发送广播的区别:

sendBroadcase;

sendOrderedBroadcast;

sendStickyBroadcast;离线消息

2、服务:(1)、服务类继承Service类

         (2)、注册服务类

服务种类:本地服务:在一个工程里面的服务,应用和代码在一个工程。在一个apk。与我们的 主线程(UI线程)在同一个进程里面。(代码,内存,进程)

               远程服务:服务分布两个工程。在两个apk。UI线程在一个进程里面。服务在另外一个进程里面。这两个进程不能直接通信!(代码,内存,进程0

服务的Form(形式):可以混用

                              started:启动,停止我们的服务。

                              bound:得到服务对象。用bound是因为服务于客户端在两个进程里面。

服务角色:

服务端:onBind(){

      return binder;

}(aidl接口)

 客户端:连接的回调函数{

      aidl接口(xxx1.Stub.asInterface(binder));

}aidl远程对象的接口。

远程的binder(服务端Stub)服务端真正实现的业务逻辑(Stub)。

两个进程之间传递数据:

(1)、基本数据类型(自动打包(parcel))

(2)、自定义类型(不会自动打包)

          自定义类型需要实现接口parcelable

          实现打包方法

          实现解包方法

context相关的实现的代码(google实现)\base\core\java\android\app\ContextImpl.java

 3、进程间通信(IPC):binder

AIDL:

(1)、客户端与服务器AIDL包名要一致(一模一样)。

public static abstract class Stub extends android.os.Binder implements com.test.demo.IMyService{

       private static final java.lang.String DESCRIPTOR = "com.test.demo.IMyService";

       public Stub(){

            this.attachInterface(this, DESCRIPTOR);

       }

       new Stub(); //将类Stub放到Binder里面去:

       public Stub(){

             Binder.attchInterface(Stub, DESCRIPTOR);

       }

}

Binder实现了IBinder接口:IBinder == Binder

因为Stub extends Binder 所以在服务器端 IBinder onBind(return Stub;)

                                                         Binder onBind(return Stub;)

android.os.IInterface iin = (android.os.IInterface) obj.queryLocalInterface(DESCRIPTOR);

查询本地有没有Stub对象存在

远程服务(服务不在当前工程里)

调用return new com.test.demo.IMyService.Stub.Proxy(obj);

onServiceConnected(Binder) IMyService.Stub.asInterface(Binder);

   new Proxy (Binder);

   mRemote = Binder

proxy就有Binder,binder远程服务器传过来的

下面的语句:private IMyService iMyService;

                 iMyService = IMyService.Stub.asInterface(service);返回的是一个Proxy类

               Proxy类实现IMyService(Proxy implements com.test.demo.IMyService)

加分运算: int retNum = iMyService.add(100,200);

               iMyService > Proxy类所以调用的是Proxy类的add方法。

 

Proxy类的add方法:干了什么?  

 Parcel :打包,打小包。   

  mRemote.transact(Stub.TRANSACTION_add, _data, _reply, 0);  

 Stub.TRANSACTION_add:调用远程的方法。

  _data:传送到服务的数据。

  _reply:服务执行完加法运算后返回的结果。

  然后取结果:_result = _reply.readInt();   

  下面的操作就会得到远程服务的计算结果了。

  int retNum = iMyService.add(100, 200);

 远程服务:   public boolean onTransact(int code, android.os.Parcel data,     android.os.Parcel reply, int flags)     

 

转载于:https://www.cnblogs.com/Tiny339/archive/2013/01/21/android_2.html

  • 点赞
  • 收藏
  • 分享
  • 文章举报
aa2568625397 发布了0 篇原创文章 · 获赞 0 · 访问量 48 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: