android callRemoteService 调用其他进程的service

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

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

服务也业务代码:

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的创建

package com.example.remoteservice;

interface IServcice {
	void callMethodInService();
}

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

 <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.asInterface()方法.将onServiceConnected的IBinder参数转换成IService类型;
 8:调用IService中的方法(调用服务中的方法),


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

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


调用外部服务的代码实现

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 interface definition language)(在编号24的两个例子)<br>
 * 1创建一个服务,该服务中要有能被调用的方法;<br>
 * 2:定义一个借口IService, 接口里面的抽象方法去调用服务中的方法,去掉定义接口和接口中方法的修饰符,把这个接口的扩展名该为.aidl,;<br>
 * 3:定义一个MyBinder对象,继承编译器根据IService.aidl在gen中创建的IService类中的Sutb类,
 * 在onBind方法中返回MyBinder对象<br>
 * 4:在调用服务的工程中创建包,包名要与被调用服务工程中对应aidl文件所在的包名一样.并复制被调用工程对应的aidl文件到本地对应aidl文件包中<br>
 * 5:在activity中通过bindService ()绑定一个服务;<br>
 * 6:创建一个MyConn实现ServiceConnection接口 ,服务绑定成功后执行接口中的方法;<br>
 * 7:在实现接口中的onServiceConnected()方法调用IServcice.Stub.asInterface()方法.
 * 将onServiceConnected的IBinder参数转换成IService类型<br>
 * 8:调用IService中的方法(调用服务中的方法),
 * 
 * @author Administrator
 * 
 */
public class MainActivity extends Activity {
	private IServcice iServcice;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		Intent intent = new Intent();
		intent.setAction("com.example.remoteservice");// 隐式意图,指定访问服务的action,就是被调用服务进程值注册服务的时候指定的action的值
		bindService(intent, new MyConn(), Context.BIND_AUTO_CREATE);// 通过隐式意图绑定到外部服务.参数2是服务绑定成功后的一个回调类.通过他可以获取外部服务对外提供数据的对象
	}

	public void click(View view) {
		try {
			iServcice.callMethodInService();
		} catch (RemoteException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	class MyConn implements ServiceConnection {

		@Override
		/**
		 * 参数IBinder就是绑定被调用的服务执行onBind的返回值
		 */
		public void onServiceConnected(ComponentName arg0, IBinder service) {
			iServcice = IServcice.Stub.asInterface(service);// 调用外部进程中service的转换方法
		}

		@Override
		public void onServiceDisconnected(ComponentName arg0) {
			// TODO Auto-generated method stub

		}

	}
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值