AIDL(Android Interface definition language)学习笔记一
一、源码结构:
二、Manifest文件
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.qiao.aidl.test1"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="7" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<activity
android:label="@string/app_name"
android:name=".AIDL_Demo_1Activity" >
<intent-filter >
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:name="com.qiao.aidl.service.MusicService" android:enabled="true"></service>
</application>
</manifest>
三、AIDL文件
package com.qiao.aidl.aidl;
interface IServicePlayer{
void play();
void pause();
void stop();
int getDuration();
int getCurrentPosition();
void seekTo(int current);
boolean setLoop(boolean loop);
}
四、MusicService
package com.qiao.aidl.service;
import java.io.File;
import java.io.IOException;
import com.qiao.aidl.aidl.IServicePlayer;
import com.qiao.aidl.test1.R;
import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.Environment;
import android.os.IBinder;
import android.os.RemoteException;
public class MusicService extends Service{
public static final String TAG = "MusicService";
public static MediaPlayer mediaPlayer = null;
public boolean isPause = false;
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
//第一种加载音乐文件的方法,即把音乐文件放在res资源文件中
// mediaPlayer = MediaPlayer.create(getApplicationContext(), R.raw.test);
//第二种加载音乐文件的方法,读取本地SD卡上的音乐文件
mediaPlayer = new MediaPlayer();
try {
loadMusicFileFromSDCard("光辉岁月_Beyond.mp3");
} catch (IOException e) {
System.out.println("文件读取失败");
e.printStackTrace();
}
}
private void loadMusicFileFromSDCard(String fileName) throws IOException{
File audioFile = new File("/sdcard/DUOMI/music/",fileName);
mediaPlayer.reset();
mediaPlayer.setDataSource(audioFile.getAbsolutePath());
mediaPlayer.prepare();
}
IServicePlayer.Stub stub = new IServicePlayer.Stub() {
@Override
public void stop() throws RemoteException {
// TODO Auto-generated method stub
mediaPlayer.start();
}
@Override
public boolean setLoop(boolean loop) throws RemoteException {
// TODO Auto-generated method stub
return false;
}
@Override
public void seekTo(int current) throws RemoteException {
// TODO Auto-generated method stub
mediaPlayer.seekTo(current);
}
@Override
public void play() throws RemoteException {
// TODO Auto-generated method stub
mediaPlayer.start();
}
@Override
public void pause() throws RemoteException {
// TODO Auto-generated method stub
mediaPlayer.pause();
}
@Override
public int getDuration() throws RemoteException {
// TODO Auto-generated method stub
return mediaPlayer.getDuration();
}
@Override
public int getCurrentPosition() throws RemoteException {
// TODO Auto-generated method stub
return mediaPlayer.getCurrentPosition();
}
};
@Override
public IBinder onBind(Intent intent) {
return stub;
}
}
五、Activity
package com.qiao.aidl.test1;
import com.qiao.aidl.aidl.IServicePlayer;
import com.qiao.aidl.service.MusicService;
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.Handler;
import android.os.IBinder;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
public class AIDL_Demo_1Activity extends Activity {
private static final String TAG = "AIDL_Demo_1Activity";
private SeekBar seekBar = null;
private Button btnPlay = null;
IServicePlayer iServicePlayer = null;
boolean isPlay = false;
boolean isLoop = false;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
seekBar = (SeekBar)findViewById(R.id.seekBar);
btnPlay = (Button)findViewById(R.id.btnPlay);
bindService(new Intent(AIDL_Demo_1Activity.this, MusicService.class), conn, Context.BIND_AUTO_CREATE);
startService(new Intent(AIDL_Demo_1Activity.this, MusicService.class));
btnPlay.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
System.out.println(TAG + " play button onClicked.");
if(!isPlay){
try {
iServicePlayer.play();
} catch (Exception e) {
e.printStackTrace();
}
btnPlay.setText("暂停");
isPlay = true;
} else {
try {
iServicePlayer.pause();
} catch (Exception e) {
e.printStackTrace();
}
btnPlay.setText("播放");
isPlay = false;
}
}
});
seekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
if(iServicePlayer != null){
try {
iServicePlayer.seekTo(seekBar.getProgress());
} catch (Exception e) {
e.printStackTrace();
}
}
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
}
});
handler.post(updateThread);
}
private ServiceConnection conn = new ServiceConnection(){
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
System.out.println(TAG + " : onServiceConnected()");
iServicePlayer = IServicePlayer.Stub.asInterface(service);
}
@Override
public void onServiceDisconnected(ComponentName name) {
System.out.println(TAG + " : onServiceDisconnected()");
}
};
Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
}
};
private Runnable updateThread = new Runnable() {
@Override
public void run() {
if(iServicePlayer != null){
try {
seekBar.setMax(iServicePlayer.getDuration());
seekBar.setProgress(iServicePlayer.getCurrentPosition());
} catch (Exception e) {
e.printStackTrace();
}
}
handler.post(updateThread);
}
};
}