AIDL(AndRoid接口描述语言)是一种借口描述语言; 编译器可以通过aidl文件生成一段代码,通过预先定义的接口达到两个进程内部通信进程的目的. 如果需要在一个Activity中, 访问另一个Service中的某个对象, 需要先将对象转化成AIDL可识别的参数(可能是多个参数), 然后使用AIDL来传递这些参数, 在消息的接收端, 使用这些参数组装成自己需要的对象.
1.定义:src/package/IPlayer.aidl文件。
如:
package com.chonwhite.mplayer; //--要有包的全称。
interface IPlayer{
void play();
void pause();
void stop();
int getDuration();
int getCurrentTime();
void setCurrent(int cur);
boolean isPlaying();
}
2.定义Service 服务
public class LocalService extends Service {
private NotificationManager mNM;
private MediaPlayer mPlayer;
IPlayer.Stub stub = new IPlayer.Stub() {
public void play() throws RemoteException {
mPlayer.start();
}
public void pause() throws RemoteException {
mPlayer.pause();
}
public void stop() throws RemoteException {
mPlayer.stop();
}
public int getDuration() throws RemoteException {
return mPlayer.getDuration();
}
public int getCurrentTime() throws RemoteException {
return mPlayer.getCurrentPosition();
}
public void setCurrent(int cur) throws RemoteException {
mPlayer.seekTo(cur);
}
public boolean isPlaying() throws RemoteException {
return mPlayer.isPlaying();
}
};
@Override
public void onCreate() {
mNM = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
mPlayer = MediaPlayer.create(this, R.raw.fly);
mPlayer.start();
showNotification();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i("LocalService", "Received start id " + startId + ": " + intent);
// We want this service to continue running until it is explicitly
// stopped, so return sticky.
return START_STICKY;
}
@Override
public void onDestroy() {
// Cancel the persistent notification.
mNM.cancel("ServiceStarted", 0);
// Tell the user we stopped.
Toast.makeText(this, "ServiceStoped", Toast.LENGTH_SHORT).show();
}
@Override
public IBinder onBind(Intent intent) {
return stub;
}
@Override
public boolean onUnbind(Intent intent) {
return super.onUnbind(intent);
}
/**
* Show a notification while this service is running.
*/
private void showNotification() {
// In this sample, we'll use the same text for the ticker and the expanded notification
CharSequence text = "LocalServiceStarted";
// Set the icon, scrolling text and timestamp
Notification notification = new Notification(R.drawable.icon, text,
System.currentTimeMillis());
// The PendingIntent to launch our activity if the user selects this notification
PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
new Intent(this, Main.class), 0);
// Set the info for the views that show in the notification panel.
notification.setLatestEventInfo(this, "ServiceLable",
text, contentIntent);
// Send the notification.
// We use a layout id because it is a unique number. We use it later to cancel.
mNM.notify("LocalServiceStarted", 0, notification);
}
}
3.调用Service
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
bindService(new Intent(Main.this, LocalService.class), mConnection, Context.BIND_AUTO_CREATE);
}
void doUnbindService() {
unbindService(mConnection);
}
@Override
protected void onDestroy() {
super.onDestroy();
doUnbindService();
}
private ServiceConnection mConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName className, IBinder service) {
mPlayer = IPlayer.Stub.asInterface(service);
// Tell the user about this for our demo.
Toast.makeText(Main.this, getString(R.string.serviceconnected),
Toast.LENGTH_SHORT).show();
}
public void onServiceDisconnected(ComponentName className) {
mPlayer = null;
Toast.makeText(Main.this, getString(R.string.serviedisconnected),
Toast.LENGTH_SHORT).show();
};
};
4:Android.mk
添加:
LOCAL_SRC_FILES := $(call all-java-files-under, src) /
src/com/chonwhite/mplayer/IPlayer.aidl