Android学习之远程绑定调用service

http://blog.csdn.net/q1234456gggg_jkjg/article/details/8479070

远程绑定调用service主要是用来不同进程的信息共享。就比如服务器和客户端,在服务器端设置好一个service提供方法或信息,然后客户端可以直 接调用服务器端service提供方法或信息。这里有个前提是客户端必须有和服务器端一份一样的AIDL,然后服务器端在客户端使用的系统上有注册过(也 就是安装运行过一次),之后客户端就可以远程绑定调用服务器端的service了。

具体的步骤如下:

1.首先,是服务器的

1)创建一个android应用工程

2)  在主Aitivity所在的包里新建个AIDL文件,这是ADT会自动帮你在gen目录下生成一个和AIDL文件同名的JAVA文件(这里的AidlService.java是下一步骤生成的,这里可以先忽略)

3)如上图所示,创建一个用来使用service的类(AidlService.java)

具体每个文件的代码如下:

AidlServerActivity.java

[java] view
plain
copy

  1. package

    import
    import
    import
    import
    import
    import
    import

    publicclassextends

  2. publicvoid
    super

    new

  3. publicvoid
  4. newthis
    class

    this

    }

IAidlService.aidl

[java] view
plain
copy

  1. package
    interface
    int
    }

AidlService.java

[java] view
plain
copy

  1. package

    import
    import
    import
    import
    import

    publicclassextends
    privateboolean
    privateint

    privateclassextends

  2. publicintthrows
  3. return;
  4. privatevoid
    , );
  5. publicvoid
    super

    new Thread(new Runnable(){

  6. @Override
  7. public void run(){
  8. while(!unrunnable){
  9. try{
  10. Thread.sleep(1000);
  11. }catch(InterruptedException e){
  12. }
  13. count++;
  14. Log.v("AidlService","count:"+count);
  15. }
  16. }
  17. }).start();
  18. */
    ,);
  19. /*
  20. @Override
  21. public void onStart(Intent intent, int startId) {
  22. Log("service start id=" + startId);
  23. }
  24. */
  25. public

    returnnew

  26. publicvoid

    true
    super

  27. @Override
  28. public boolean onUnbind(Intent intent) {
  29. Log("service on unbind");
  30. return super.onUnbind(intent);
  31. }
  32. public void onRebind(Intent intent) {
  33. Log("service on rebind");
  34. super.onRebind(intent);
  35. }
  36. */

    }

布局文件AndroidManifest.xml

[html] view
plain
copy

  1. <?xml= =?>
    <manifest=
  2. =
  3. =
  4. = >

    <uses-sdk= />

    <application
    =

  5. = >
    <activity
    =
  6. = >
    <intent-filter>
    <action= />

    <category= />
    </intent-filter>
    </activity>

    <service
    =

  7. =
  8. = >
    <intent-filter>
  9. <action= />
    <category= />
    </intent-filter>
    </service>
    </application>

    </manifest>

这里,服务器端的工作做好了,接下来是客户端的工作。

2.接着,是客户端的:

1)首先,创建一个工程

2)接着,把服务器端的一些文件拷贝过来(创建com.ds.server这个包,然后往里面复制进入如下图的服务器端的文件(IAidlService.java)

 

下面是个文件的内容

AidlClientActivity.java

[java] view
plain
copy

  1. package

    import

    import
    import
    import
    import
    import
    import
    import
    import
    import
    import
    import
    import

    publicclassextends

    int

    privatenew

    publicvoid

  2. ,

    publicvoid

  3. null
    ,);
  4. publicvoid
    super

    final

    new

  5. publicvoid
  6. newclass

    ifnull
    try
    ,+iservice.getType()+
    catch

    else

    }

AndroidManifest.xml

[html] view
plain
copy

  1. <?xml= =?>
    <manifest=
  2. =
  3. =
  4. = >

    <uses-sdk= />

    <application
    =

  5. = >
    <activity
    =
  6. = >
    <intent-filter>
    <action= />

    <category= />
    </intent-filter>
    </activity>
    </application>

    </manifest>

这样客户端的工作也算完了,但这里我还想说下一个问题。

你可能会看到在客户端的Activity文件里,有个count的变量,觉得是多余的,但这是为了说明下面这个问题的需要。

最开始的count是0,然后我运行客户端后,鼠标左击bind按钮,会发现LogCat的verbose窗口会显示

为什么没有执行 Log.v("AidlClientActivity","oncreate"+iservice.getType()+" "+count);这一句,然后我再点击下bind

终于出现想要的结果,这里你就会发现count变成1了,也就是之前执行过一次count+1了,这就说明了,第一次只是绑定,返回的 iservice是null,第二次以上才会返回对象。

到这里就是我之前一直错误的地方,是理解错了,我之前写的程序没有按钮,是直接启动客户端后就绑定调用service,由于没有按钮不能多次按,也就会造成得不到想要的结果了。这里总算明白它的一些运行机制了,先写到这里,后面有什么新发现会及时更新。

时间: 2024-10-07 22:36:22

Android学习之远程绑定调用service的相关文章

Android学习Scroller(二)——ViewGroup调用scrollTo()

MainActivity如下: package cc.ac; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.LinearLayout; import android.app.Activity; /** * Demo描述: * 对ViewGroup调用sc

Android学习Scroller(一)——View调用scrollTo()的理解及使用

MainActivity如下: package cc.uu; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; import android.app.Activity; /** * Demo描述: * scrollTo()和scrollB

Android学习笔记二十四.Service入门(二)绑定本地Service并与之通信

绑定本地Service并与之通信    通过上一篇博文的前3步,我们就算完成了一个Service及使用该Service的应用程序(Service为该应用程序的组成部分).但当程序通过startService()和stopService()启动.关闭Service时,Service与访问者之间基本上不存在太多的关联,因此Service和访问者之间也无法进行通信.数据交换.如果我们希望开发的Service能与访问者之间实现方法调用或数据交换,我们可以让访问者使用bindService()和unbin

Android学习(十四) Service组件

一.定义 运行在后台,没有页面,不可见.优先级高于Activity,当系统内存不足时,会先释放一些Activity.注意,Service同样是运行在主线程中,不能做一些耗时操作.如果一定要做一些耗时的操作,启动一个新的线程,在新的线程中来处理. 二.用途: 播放音乐,记录地理位置的改变,监听某些动作. 三.Sevice分类: 1.本地服务(Local Service):是一种本地服务,一般用于应用程序内部,通过startService方法启动,通过stopService,stopSelf,sto

Android学习笔记二十五.Service组件入门(三)使用IntentService

使用IntentService 1.Service缺陷 由于Service本身存在以下两个问题: (1)Service不会专门启动一条单独的进程,Service与他所在应用位于同一进程中: (2)Service也不是专门一条新的线程,如果我们在Service中直接处理耗时的任务,那么就会导致应用程序出现假性"卡死".如果我们需要在Service处理耗时任务,也可以在Service的onCreate()方法中启动一条新线程来处理该耗时任务(如上例).但是,问题来了,启动Service的A

Android学习笔记之,调用系统图库,添加自定义字体,屏幕截图

新年开始的第一天就来学习了慕课迎春活动中的Android心愿分享一课,学到了几个知识点,在此记录一下. 1.调用系统图库调用系统图库用的是intent,步骤为弹出系统图库选择器,选择图片后获取到所选择的图片.代码如下: //在需要的地方调用 Intent intent = new Intent(Intent.ACTION_PICK, null); intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/

Android学习记录04——绑定形式

1 编写HelloBindService方法, 2 编写BindServiceActivity方法, 3 然后运行,结果如图-- a.单击"绑定Service" b.单击"取消绑定Service" c.取消绑定后,单击"获取Service数据",提示先绑定服务 d.单击"绑定Service"后,再点击"获取Service数据" 总的来说,这次实验就是绑定形式的Service,一些注意的点都在代码注释中,也就

Android学习笔记七:调用打电话、发短信等

系统打电话界面: Intent intent = new Intent(); //系统默认的action,用来打开默认的电话界面 intent.setAction(Intent.ACTION_CALL); //需要拨打的号码 intent.setData(Uri.parse("tel:"+i)); callPhoneAndSendMessage.this.startActivity(intent); 系统发短信界面: Intent intent = new Intent(); //系统

Android学习笔记—第二章 Android四大组件

第二章 Android四大组件 Activity(活动窗口): Android程序中最基本的模块,为用户操作而展示的可视化用户界面.一个Android应用程序可以只有一个Activity,也可以包含多个Activity,数量及每个Activity的作用取决于应用程序及其设计. (1)Activity的生命周期 创建→运行   onCreate   onStart   onResume 运行→销毁   onPause    onStop    onDestory 运行→停止(不可见  不可操作)