AIDL(Android Interface Definition Language 接口定义语言)是Android提供的用于进程间通信的工具,典型的场景是用于Activity与Service间通信。下面是我所写的简单Demo,以便于理解。
一、工程目录下创建一个.aidl文件,,如IExampleService.aidl:
package com.example.testexample;
interface IExampleService {
void show();
}
注意包名与接口定义;创建完成后Eclipse会自动在 gen目录下创建名为IExampleService.java的文件。
二、工程目录下创建Service文件,ExampleService.java:
package com.example.testexample;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
import android.widget.Toast;
public class ExampleService extends Service {
private IExampleService.Stub mBinder = new IExampleService.Stub() {
@Override
public void show() throws RemoteException {
// TODO Auto-generated method stub
Toast.makeText(ExampleService.this, "Test Success!!!", Toast.LENGTH_SHORT).show();
}
};
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return mBinder;
}
}
三、工程目录下创建Activity文件,调用上述Service文件,如MainActivity.java:
package com.example.testexample;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.app.Activity;
import android.app.Service;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;
public class MainActivity extends Activity {
private static final String TAG = "MainActivity";
private IExampleService mService = null;
private ServiceConnection mServiceConnection = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mServiceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// TODO Auto-generated method stub
Log.i(TAG, "---------onServiceConnected-----------");
mService = IExampleService.Stub.asInterface(service);
}
@Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
Log.i(TAG, "---------onServiceDisconnected-----------");
mService = null;
}
};
Intent intent = new Intent(this, ExampleService.class);
this.bindService(intent, mServiceConnection, Service.BIND_AUTO_CREATE);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// TODO Auto-generated method stub
switch (item.getItemId()) {
case R.id.menu_settings:
if (mService != null) {
try {
mService.show();
catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} else {
Toast.makeText(MainActivity.this, "Test False!!!", Toast.LENGTH_SHORT).show();
}
}
return super.onOptionsItemSelected(item);
}
}
点击菜单验证发现,成功实现Activity与Service之间的通信。
本文通过一个简单的AIDL(Android Interface Definition Language)Demo,解释如何使用AIDL进行进程间通信(IPC)。首先在工程目录下创建IExampleService.aidl文件,定义接口。然后创建ExampleService类,实现接口并返回IBinder。接着在MainActivity中绑定Service,并通过AIDL接口调用Service的方法。最后点击菜单项验证通信成功。

1118

被折叠的 条评论
为什么被折叠?



