当前位置:操作系统 > 安卓/Android >>

android callRemoteService 调用其他进程的service

创建一个进程服务.程序第一次运行的时候就创建.不需要界面

要想其他进程能够跨进程的调用本进程的方法.就得使用跨进程访问的接口类型.只需将接口中类和方法的修饰符去掉就行.然后把接口类编程aidl类型

服务也业务代码:


[java] 
package com.example.remoteservice; 
 
import android.app.Service; 
import android.content.Intent; 
import android.os.IBinder; 
import android.os.RemoteException; 
 
/**
 * 跨进程访问的接口类型:将接口和接口中方法的修饰类型去掉,
 * android生成aidl文件步骤:找到编写的java源文件,将其扩展名该为aidl.然后回到项目
 * ,刷新项目,该类就会变为源文件名.aidl的文件,并且系统会自动在gen
 * .工程目录下生成原java文件的名的java文件.可以打开看下内容与之前不一样了.到此就完成了aidl的创建
 * 
 * @author Administrator
 * 
 */ 
public class RemoteService extends Service { 
 
    @Override 
    public IBinder onBind(Intent arg0) { 
        return new Mybinder(); 
    } 
 
    /**
     * 可以继承系统根据自己定义的iservice接口生成iservice.adil之后的IServcice.Stub类,
     * Stub是系统自己家上的.该类是个抽象类,继承了binder类也实现了iservice<br>
     * 
     * @author Administrator
     * 
     */ 
    public class Mybinder extends IServcice.Stub { 
 
        @Override 
        public void callMethodInService() throws RemoteException { 
            sayHelloInService(); 
        } 
 
    } 
 
    /**
     * 服务中的方法
     */ 
    public void sayHelloInService() { 
        System.out.println("hello in service"); 
    } 
 
    @Override 
    public void onCreate() { 
        System.out.println("remote service create"); 
    } 
 

服务进程对外提供调用的接口,将该接口转成aidl文件,
aidl文件的创建:找到编写的java源文件,将其扩展名该为aidl.然后回到项目,刷新项目,该类就会变为源文件名.aidl的文件,并且系统会自动在gen .工程目录下生成原java文件的名的java文件.可以打开看下内容与之前不一样了.到此就完成了aidl的创建


[html] 
package com.example.remoteservice; 
 
inte易做图ce IServcice { 
    void callMethodInService(); 

在配置文件application中注册该服务

[html]
<service android:name=".RemoteService" > 
           <intent-filter> 
               <action android:name="com.example.remoteservice" /> <!-- 指定action,可方便别的程序调用 --> 
 
           </intent-filter> 
       </service> 

到此被调用的服务就创建好了.如果想对外使用.必须启动该进程.和服务.所以.为配合下面调用的例子(调用外部进程的服务)必须保证该进程的正常运行.
总结以上调用本进程中服务的方法:

 1创建一个服务,该服务中要有能被调用的方法;
 2:定义一个借口IService, 接口里面的抽象方法去调用服务中的方法 ;
 3:定义一个MyBinder对象.继承binder类,并实现IService接口,在onBind方法中返回MyBinder对象;
 4:在activity中通过bindService ()绑定一个服务;
 5:创建一个MyConn实现ServiceConnection接口 ,服务绑定成功后执行接口中的onServiceConnected()方法;
 6:onServiceConnected ()方法的IBinder参数就是IService类型的,强制转换为IService;
 7:调用ISservice中方法

调用外部进程中服务(上面的进程)

访问其他进程中服务的步骤:

 访问外部服务.要知道对方服务的action,和可以调用服务接口的adil文件以及adil文件的包名.在本地程序创建调用服务的aidl文件的包,并添加(copy)外部服务的aidl文件,系统会自动在gen目录下创建该adil文件接口java文件

 1创建一个服务,该服务中要有能被调用的方法;
 2:定义一个借口IService, 接口里面的抽象方法去调用服务中的方法,去掉定义接口和接口中方法的修饰符,把这个接口的扩展名该为.aidl,;
 3:定义一个MyBinder对象,继承编译器根据IService.aidl在gen中创建的IService类中的Sutb类,
 在onBind方法中返回MyBinder对象
 4:在调用服务的工程中创建包,包名要与被调用服务工程中对应aidl文件所在的包名一样.并复制被调用工程对应的aidl文件到本地对应aidl文件包中
 5:在activity中通过bindService ()绑定一个服务;
 6:创建一个MyConn实现ServiceConnection接口 ,服务绑定成功后执行接口中的方法;
 7:在实现接口中的onServiceConnected()方法调用IServcice.Stub.asInte易做图ce()方法.将onServiceConnected的IBinder参数转换成IService类型;
 8:调用IService中的方法(调用服务中的方法),

 

按照上面步骤创建了同样的包和copy了被调用的aidl文件之后,创建调用外部进程页面的布局.本例只以一个button为例


[html] 
<Button 
    android:id="@+id/call" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:onClick="click" 
    android:text="调用外部服务" /> 


调用外部服务的代码实现

[java]
package com.example.callremoteservice; 
 
import com.example.remoteservice.IServcice; 
 
import android.app.Activity; 
import android.content.ComponentName; 
import android.content.Context; 
import android.content.Intent; 
import android.content.ServiceConnection; 
import android.os.Bundle; 
import android.os.IBinder; 
import android.os.RemoteException; 
import android.view.View; 
 
/**
 * 访问外部服务.要知道对方服务的action,和可以调用服务接口的adil文件以及adil文件的包名<br>
 * 在本地程序创建调用服务的adil文件的包,并添加外部服务的adil文件,系统会自动在gen目录下创建该adil文件接口java文件<br>
 * 总结:<br>
 * 访问本进程中的service,需要用到bindService()方法.(cz23_serverlifecycle)<br>
 * 
 * 1创建一个服务,该服务中要有能被调用的方法;<br>
 * 2:定义一个借口IService, 接口里面的抽象方法去调用服务中的方法 ;<br>
 * 3:定义一个MyBinder对象.继承binder类,并实现IService接口,在onBind方法中返回MyBinder对象;<br>
 * 4:在activity中通过bindService ()绑定一个服务;<br>
 * 5:创建一个MyConn实现ServiceConnection接口 ,服务绑定成功后执行接口中的onServiceConnected()方法;<br>
 * 6:onServiceConnected ()方法的IBinder参数就是IService类型的,强制转换为IService;<br>
 * 7:调用ISservice中方法<br>
 * <br>
 * 访问 外部进程中的service,需要用到aidl(android inte易做图ce definition language)(在编号24的两个例子)<br>
 * 1创建一个服务,该服务中要有能被调用的方法;<br>
 * 2:定义一个借口ISe

补充:移动开发 , Android ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,