两个应用分别是anotherapp和app,本次从anotherapp启动app中的AppService并进行通信。
app中AppService.java:
package com.minardwu.learnaidl;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
public class AppService extends Service {
private String data = "默认数据";
private boolean isRunning;
public AppService() {
}
@Override
public IBinder onBind(Intent intent) {
return new IAppServiceInterface.Stub() {
@Override
public void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, String aString) throws RemoteException {
}
@Override
public void setData(String data) throws RemoteException {
AppService.this.data = data;
}
};
}
@Override
public void onCreate() {
super.onCreate();
System.out.println("onCreate");
isRunning = true;
new Thread(){
@Override
public void run() {
super.run();
while (isRunning){
System.out.println(data);
try {
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}.start();
}
@Override
public void onDestroy() {
super.onDestroy();
isRunning = false;
System.out.println("onDestory");
}
}
app中IAppServiceInterface.aidl(在anotherapp中也要复制一份):
// IAppServiceInterface.aidl
package com.minardwu.learnaidl;
// Declare any non-default types here with import statements
interface IAppServiceInterface {
/**
* Demonstrates some basic types that you can use as parameters
* and return values in AIDL.
*/
void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat,
double aDouble, String aString);
void setData(String data);
}
anotherapp中的ManActivity.java:
package com.minardwu.anotherapp;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.IBinder;
import android.os.RemoteException;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import com.minardwu.learnaidl.IAppServiceInterface;
public class MainActivity extends AppCompatActivity implements View.OnClickListener, ServiceConnection {
private Intent intent;
private EditText et;
private IAppServiceInterface appServiceInterface = null;//若绑定外部服务成功则在onServiceConected函数中被赋值
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
intent = new Intent();
intent.setComponent(new ComponentName("com.minardwu.learnaidl","com.minardwu.learnaidl.AppService"));
et = (EditText) findViewById(R.id.et);
et.setText("另一个应用的数据");
findViewById(R.id.start).setOnClickListener(this);
findViewById(R.id.stop).setOnClickListener(this);
findViewById(R.id.bind).setOnClickListener(this);
findViewById(R.id.unbind).setOnClickListener(this);
findViewById(R.id.change).setOnClickListener(this);
}
//如果只是单纯的startService和stopService不需要AIDL
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.start:
startService(intent);
break;
case R.id.stop:
stopService(intent);
break;
case R.id.bind:
bindService(intent,this, Context.BIND_AUTO_CREATE);
break;
case R.id.unbind:
unbindService(this);
appServiceInterface = null;
break;
case R.id.change:
if(appServiceInterface!=null)
try {
appServiceInterface.setData(et.getText().toString());
} catch (RemoteException e) {
e.printStackTrace();
}
break;
}
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
System.out.println("onServiceConnected");
appServiceInterface = IAppServiceInterface.Stub.asInterface(service);
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
}