service client /server 端示例:
server端,
step 1 添加aidl 文件,这个文件只是定义用要的接口,接口名字要与文件名相同。
如:ItrainningService.aidl
package com.company.server.aidl;
import com.company.server.aidl.FinishCallBack;
interface ItrainningService{
void function_one(String abc,String op);
void function_two(String abc);
void registerCallback(FinishCallBack cb);
void unregisterCallback(FinishCallBack cb);
}
FinishCallBack.aidl
package com.company.server.aidl;
interface FinishCallBack {
void onFinish(String s,int a);
}
它们放的位置也是有要求的,需要和包名相同,另外,如果是在android studio 中编译的话,要放在main下面,最外层还要有一个aidl,
比如上的的文件要放在../main/aidl/com/company/server/aidl/下面。
step 2, 建立service类ServerService, 这个java文件要import 我们上面定义的接口
另外,还定义了一个
class ServerBinder
...
import com.company.server.aidl.ItrainningService;
import com.company.server.aidl.FinishCallBack;
public class ServerService extends Service {
final String TAG = "ServerService";
FinishCallBack finishCallBack;
public ServerService() {
}
private IBinder binder = new ServerBinder();
@Override
public IBinder onBind(Intent intent) {
Log.i(TAG, "onBind service");
// TODO Auto-generated method stub
return binder;
}
@Override
public void onStart(Intent intent, int startId) {
// TODO Auto-generated method stub
super.onStart(intent, startId);
Log.i(TAG, "start service");
}
@Override
public boolean bindService(Intent service, ServiceConnection conn, int flags) {
// TODO Auto-generated method stub
Log.i(TAG, "bind service");
return super.bindService(service, conn, flags);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// TODO Auto-generated method stub
Log.i(TAG, "start service");
return super.onStartCommand(intent, flags, startId);
}
//继承stub,实现ItrainningService的接口
private final class ServerBinder extends ItrainningService.Stub {
@Override
public void function_one(String abc, String op) throws RemoteException {
Context context = CApplication.getInstance();
if(MyfuncClass.function_one(context,pkgName,pkgPath)==0){
//success
finishCallBack.onFinish(pkgPath,0);
}else{
//fail
finishCallBack.onFinish(pkgPath,1);
}
}
@Override
public void function_two(String pkgName) throws RemoteException {
Context context = CApplication.getInstance();
MyfuncClass.function_two(context, pkgName);
}
@Override
public void registerCallback(FinishCallBack cb) throws RemoteException {
if (cb != null) {
finishCallBack = cb;
}
}
@Override
public void unregisterCallback(FinishCallBack cb) throws RemoteException {
if(cb != null) {
finishCallBack = cb;
}
}
}
}
注册下Service:
<service android:name=".silent.InstallService">
<intent-filter >
<action android:name="com.company.server.ServerService"/>
</intent-filter>
</service>
客户端:
Step 1:把服务端的AIDL文件拷贝下,拷贝后目录如之前server端:
放在../main/aidl/com/company/server/aidl/下面
Step 2:编写简单的布局,再接着就是核心MainActvitiy的实现了
定义一个ServciceConnection对象,重写对应方法,和前面的普通数据的类似
再接着在bindService,然后再Button的点击事件中获取Salary对象并显示出来!
package com.client.demo;
import com.company.server.aidl.ItrainningService;
import com.company.server.aidl.FinishCallBack;
public class MainActivity extends AppCompatActivity {
private Button silentinstalbtn;
private Context mcontext;
ItrainningService trainserviceInterface;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
mcontext = getApplication();
//绑定service
Intent service = new Intent("com.company.server.ServerService")
.setPackage("com.company.server");
bindService(service, conn, BIND_AUTO_CREATE);
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
});
silentbtn = (Button) findViewById(R.id.demobtn);
silentbtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String packageName = "open";
try {
if(true) {
new testThread("packageName","/sdcard/109.apk").start();
}
} catch (RemoteException e) {
Log.e("demo"," error");
e.printStackTrace();
}
}
});
}
private class testThread extends Thread {
private String mPackageName;
private String mPkgpath;
testThread(String packageName, String pkgpath){
super("UninstallTread");
mPackageName = packageName;
mPkgpath = pkgpath;
}
@Override
public void run() {
try {
//调用service接口:
trainserviceInterface.installSilent(mPackageName,mPkgpath);
} catch (RemoteException e) {
Log.e("demo","installTread error");
e.printStackTrace();
}
}
}
private FinishCallBack mCallback = new FinishCallBack.Stub() {
@Override
public void onFinish(String s,int a) throws RemoteException {//返回文件路径和错误代码
if(a == 0) {
Log.w("demo", "FinishCallBack success path == " + s + " int===" + a);
}else{
Log.e("demo", "FinishCallBack fail path == " + s + " int===" + a);
}
}
};
...
ServiceConnection conn = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
trainserviceInterface = ItrainningService.Stub.asInterface(service);
try {
trainserviceInterface.registerCallback(mCallback);
} catch (RemoteException e) {
e.printStackTrace();
}
}
};
}