016_03浅谈远程Service和AIDL

   如果需要访问不同进程间service中的数据或者方法,需要使用AIDL(android interface description language)工具,可以通过如下方法:

public boolean bindService(Intent intent, ServiceConnection conn, int flags) ; 
        public void unbindService(ServiceConnection conn);

intent是跳转到service的intent,conn是与service连接状态的类。如果想要访问service中的数据,可以在onServiceConnected()方法中进行实现。

  如果另外一个进程想访问上图Myservice.java中getruntimeinfo()方法

1     public String getruntimeinfo(){
2         String info = "momory usage 5%";
3         return info;
4     }

则需要以下步骤:

1,新建一个interface

1 package com.example.day16_04remoteservicedemo;
2
3 public interface MyRemoteService {
4      public String forworadgetruntimeinfo();
5 }

2,到源程序目录下找到MyRemoteService.java,直接将后缀名改为.aidl并保存

3,刷新project,可看到eclipse中报错

4,去掉public,保存;可看到在gen下自动生成MyRemoteService.java

5,在MyService.java中继承MyRemoteService.java中的Stub类

1     class RemoteBinder extends  Stub{
2         @Override
3         public String forworadgetruntimeinfo() throws RemoteException {
4             return getruntimeinfo();
5         }
6     }

6,在AndroidManifest.xml中配置service

1         <service android:name=".MyService">
2              <intent-filter>
3                     <action android:name="com.cskaoyan.service" />
4              </intent-filter>
5         </service>

被访问的service源代码如下:

 1 package com.example.day16_04remoteservicedemo;
 2
 3 import com.example.day16_04remoteservicedemo.MyRemoteService.Stub;
 4 import android.app.Service;
 5 import android.content.Intent;
 6 import android.os.IBinder;
 7 import android.os.RemoteException;
 8
 9 public class MyService extends Service {
10     IBinder binder ;
11     @Override
12     public IBinder onBind(Intent intent) {
13         // TODO Auto-generated method stub
14         System.out.println("MyService.onBind()");
15         //当且仅当此处返回一个非空的Ibinder对象时,bindservice一端的Connection内的onserviceConnected函数才会被系统call到
16         return  new RemoteBinder();
17     }
18
19     public String getruntimeinfo(){
20         String info = "momory usage 5%";
21         return info;
22     }
23
24     @Override
25     public boolean onUnbind(Intent intent) {
26         // TODO Auto-generated method stub
27         System.out.println("MyService.onUnbind()");
28         return super.onUnbind(intent);
29     }
30
31     @Override
32     public void onRebind(Intent intent) {
33         // TODO Auto-generated method stub
34         super.onRebind(intent);
35         System.out.println("MyService.onRebind()");
36     }
37
38     @Override
39     public void onCreate() {
40         // TODO Auto-generated method stub
41         super.onCreate();
42         System.out.println("MyService.onCreate()");
43     }
44
45     @Override
46     public void onDestroy() {
47         // TODO Auto-generated method stub
48         super.onDestroy();
49         System.out.println("MyService.onDestroy()");
50     }
51
52     class RemoteBinder extends  Stub{
53         @Override
54         public String forworadgetruntimeinfo() throws RemoteException {
55             // TODO Auto-generated method stub
56             return getruntimeinfo();
57         }
58     }
59 }

MyRemoteService.aidl

1 package com.example.day16_04remoteservicedemo;
2
3  interface MyRemoteService {
4      String forworadgetruntimeinfo();
5 }
 1 <?xml version="1.0" encoding="utf-8"?>
 2 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
 3     package="com.example.day16_04remoteservicedemo"
 4     android:versionCode="1"
 5     android:versionName="1.0" >
 6
 7     <uses-sdk
 8         android:minSdkVersion="14"
 9         android:targetSdkVersion="21" />
10
11     <application
12         android:allowBackup="true"
13         android:icon="@drawable/ic_launcher"
14         android:label="@string/app_name"
15         android:theme="@style/AppTheme" >
16         <service android:name=".MyService">
17             <intent-filter>
18                 <action android:name="com.cskaoyan.service" />
19              </intent-filter>
20         </service>
21     </application>
22
23 </manifest>

然后再来写客户端:

将com.example.day16_04remoteservicedemo下的MyRemoteService.aidl直接拷贝过来,放置位置如下图:

最重要的一步是如何在OnServiceConnected方法中得到一个IBinder对象

 1     class MyConnection implements ServiceConnection{
 2
 3         @Override
 4         public void onServiceConnected(ComponentName name, IBinder service) {
 5             //binder= (Stub) service;不可行
 6             //因为绑定远程Service的ServiceConnection并不能直接获取Service的OnBind()
 7             //方法返回的对象,它只能返回OnBind()方法所返回的对象的代理
 8             myRemoteService = MyRemoteService.Stub.asInterface(service);
 9             // TODO Auto-generated method stub
10             System.out.println("MainActivity.MyConnection.onServiceConnected()");
11         }

源代码如下:

 1 package com.example.day16_05otherapplication;
 2
 3 import com.example.day16_04remoteservicedemo.MyRemoteService;
 4 import android.app.Activity;
 5 import android.content.ComponentName;
 6 import android.content.Context;
 7 import android.content.Intent;
 8 import android.content.ServiceConnection;
 9 import android.os.Bundle;
10 import android.os.IBinder;
11 import android.os.RemoteException;
12 import android.view.View;
13
14 public class MainActivity extends Activity {
15
16     MyConnection conn;
17     MyRemoteService myRemoteService;
18
19     @Override
20     protected void onCreate(Bundle savedInstanceState) {
21         super.onCreate(savedInstanceState);
22         setContentView(R.layout.activity_main);
23     }
24
25     public void bindservice(View v){
26         Intent intent = new Intent();
27         intent.setAction("com.cskaoyan.service");
28         conn=new MyConnection();
29         bindService(intent, conn, Context.BIND_AUTO_CREATE);
30
31     }
32     public void unbindservice(View v){
33         unbindService(conn);
34         conn=null;
35     }
36
37     public void remotecall(View v) throws RemoteException{
38         System.out.println(myRemoteService.forworadgetruntimeinfo());
39         String info = myRemoteService.forworadgetruntimeinfo();
40         System.out.println("MainActivity.remotecall()"+info);
41     }
42
43     @Override
44     protected void onDestroy() {
45         // TODO Auto-generated method stub
46         super.onDestroy();
47         if (conn!=null) {
48            unbindService(conn);
49         }
50     }
51
52     class MyConnection implements ServiceConnection{
53
54         @Override
55         public void onServiceConnected(ComponentName name, IBinder service) {
56             //binder= (Stub) service;不可行
57             //因为绑定远程Service的ServiceConnection并不能直接获取Service的OnBind()
58             //方法返回的对象,它只能返回OnBind()方法所返回的对象的代理
59             myRemoteService = MyRemoteService.Stub.asInterface(service);
60             // TODO Auto-generated method stub
61             System.out.println("MainActivity.MyConnection.onServiceConnected()");
62         }
63
64         @Override
65         public void onServiceDisconnected(ComponentName name) {
66             // TODO Auto-generated method stub
67             System.out.println("MainActivity.MyConnection.DisConnected()");
68         }
69     }
70 }
 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     xmlns:tools="http://schemas.android.com/tools"
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent"
 5     android:paddingBottom="@dimen/activity_vertical_margin"
 6     android:paddingLeft="@dimen/activity_horizontal_margin"
 7     android:paddingRight="@dimen/activity_horizontal_margin"
 8     android:paddingTop="@dimen/activity_vertical_margin"
 9     tools:context="com.example.day16_05otherapplication.MainActivity"
10     android:orientation="vertical" >
11
12     <TextView
13         android:layout_width="wrap_content"
14         android:layout_height="wrap_content"
15         android:text="@string/hello_world" />
16
17      <Button
18         android:layout_width="wrap_content"
19         android:layout_height="wrap_content"
20         android:text="绑定服务"
21         android:onClick="bindservice"/>
22
23      <Button
24         android:layout_width="wrap_content"
25         android:layout_height="wrap_content"
26         android:text="解除绑定"
27         android:onClick="unbindservice" />
28      <Button
29         android:layout_width="wrap_content"
30         android:layout_height="wrap_content"
31         android:text="调用远程的方法"
32         android:onClick="remotecall"/>
33 </LinearLayout>

当点击“绑定服务后”,再点击“调用远程的方法”,就可以获取MyService.java中 getruntimeinfo()方法中的String  “momory usage 5%”

时间: 2024-09-27 17:48:20

016_03浅谈远程Service和AIDL的相关文章

浅谈 Android Service

 浅谈Android Service的基本用法: 关于Service最基本的用法自然是启动和停止操作. 启动Service有两种方式: 1.通过startService(Intent intent)方式启动,启动时会自动执行onCreate(),onStartCommand()方法. 2.通过bindService(Intent intent,ServiceConnection connection,int flag) 第一个参数是一个Intent对象,第二个参数是连接Service的实例,

浅谈 kubernetes service 那些事(上篇)

欢迎访问网易云社区,了解更多网易技术产品运营经验. 一.问题 首先,我们思考这样一个问题: 访问k8s集群中的pod, 客户端需要知道pod地址,需要感知pod的状态.那如何获取各个pod的地址?若某一node上的pod故障,客户端如何感知? 二.k8s service 什么是service 是发现后端pod服务: 是为一组具有相同功能的容器应用提供一个统一的入口地址: 是将请求进行负载分发到后端的各个容器应用上的控制器. 对service的访问来源 访问service的请求来源有两种:k8s集

浅谈 kubernetes service 那些事

说明 关于 k8s 服务这一块知识,我之前的博文中有些实例应用和说明.下面分享几位大佬的文章,加固对 service 这块有更深的理解- 分享 浅谈 kubernetes service 那些事 本文详细介绍了 k8s service 实现原理和新特性,值得深度拜读和理解- K8s Deployment YAML 名词解释 本文对 Deployment yaml 名词进行了详细解释,值得参考学习- 使用 k8s 部署你的第一个应用: Pod,Deployment 与 Service 通过简单的

android 远程Service以及AIDL的跨进程通信

在Android中,Service是运行在主线程中的,如果在Service中处理一些耗时的操作,就会导致程序出现ANR. 但如果将本地的Service转换成一个远程的Service,就不会出现这样的问题了. 转换成远程Service非常简单,只需要在注册Service的时候将他的android:process的属性制定成 :remote就可以了. 重新运行项目,你会发现,不会出现ANR了. 为什么将MyService转换成远程Service后就不会导致程序ANR了呢?这是由于,使用了远程Serv

浅谈远程登录时,ssh的加密原理

SSH:Secure Shell,是一种网络安全协议,主要用于登录远程计算机的加密过程. 登录方式主要有两种: 1.基于用户密码的登录方式:   加密原理:   当服务器知道用户请求登录时,服务器会把自己的公钥发给用户,ssh会将服务器的公钥存放在客户端的~/.ssh/known_hosts文件下,用户会根据服务器给它发的公钥进行加密,加密好好之后返回给服务器,服务器用自己的私钥解密,如果密码正确,则用户会成功登录到服务器上. 如果服务器改变了自己的公钥,客户端想要登录时必须删除自己~/.ssh

Windows Azure Cloud Service (37) 浅谈Cloud Service

<Windows Azure Platform 系列文章目录> 最近在和一些客户聊天,常常被遇到这样的问题: 1.问题一:我在创建一个新的Windows Azure Virtual Machine的虚拟机时候,会同时创建同样名称的Cloud Service(云服务). 我看微软的报价里说虚拟机会收费,云服务也会收费.这样的话,我使用虚拟机,是不是收取我虚拟机+云服务=2倍的费用? 2.问题二:我在使用VS2013,将asp.net的应用程序部署到微软的PaaS平台的时候,只会有Cloud Se

Service Cloud 零基础(一)Case 浅谈

本片参考:https://resources.docs.salesforce.com/222/latest/en-us/sfdc/pdf/salesforce_case_implementation_guide.pdf 练习可用:https://trailhead.salesforce.com/content/learn/projects/set-up-case-escalation-entitlements 我们在工作和生活中会经历很多销售流程,买过很多产品.比如作为公司的采购部采购一批电脑,

浅谈Android系统进程间通信(IPC)机制Binder中的Server和Client获得Service Manager接口之路

文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6627260 在前面一篇文章浅谈Service Manager成为Android进程间通信(IPC)机制Binder守护进程之路中,介绍了Service Manager是如何成为Binder机制的守护进程的.既然作为守护进程,Service Manager的职责当然就是为Server和Client服务了.那么,Server和Client如何获得S

浅谈Linux的远程连接

大部分情况下,我们不可能每台服务器都配置一台显示器,也不可能时刻在服务器旁边,但是我们要操作服务器,就要使用远程连接了,本篇就浅谈下如何进行远程连接Linux服务器. 环境介绍:vmware中Centsos6.5 x86_64一台,防火墙及Selinux已关闭. 一.最简单的工具 Putty 下载安装后直接运行,输入IP与保存名称即可 输入账号密码 二.最简洁的工具 Xshell 下载后直接运行,输入 ssh ip,然后输入账号.密码即可 三.最强大的工具 SecurtCRT 下载后解压,将Se