package com.demo.service;
import com.demo.service.Freq;
import com.demo.service.IServiceCallback;
interface ServiceAidl {
boolean isInited();
void registerCallback(IServiceCallback cb);
void unregisterCallback(IServiceCallback cb);
void playerInit();
int setVideoScale(int full, int x, int y, int width, int height);
void play();
/*自定義類*/
Freq getFreq();
}
|
public Freq(Parcel pl)
{
mFreq = pl.readInt();
mSymbol = pl.readInt();
mQam = pl.readInt();
}
@Override
public void writeToParcel(Parcel dest, int flags) {
// TODO Auto-generated method stub
dest.writeInt(this.mFreq);
dest.writeInt(this.mSymbol);
dest.writeInt(this.mQam);
}
//添加一個靜態成員,名爲CREATOR,該對象實現了Parcelable.Creator接口
public static final Parcelable.Creator<DvbFreq> CREATOR = new Parcelable.Creator<DvbFreq>(){
@Override
public DvbFreq createFromParcel(Parcel arg0) {
// TODO Auto-generated method stub
return new Freq(arg0);
}
@Override
public DvbFreq[] newArray(int arg0) {
// TODO Auto-generated method stub
return new Freq[arg0];
}
};
|
<service
android:name="com.demo.service"
android:enabled="true"
android:exported="true" >
<intent-filter >
<action android:name="com.demo.service.START"/>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</service>
|
private final ServiceAidl.Stub
mBinder = new ServiceAidl.Stub() {
@Override
public int setVideoScale(int full, int x, int y, int width, int height)
throws RemoteException {
// TODO Auto-generated method stub
return mService.setVideoScale(full, x, y, width, height);
}
@Override
public boolean isInited() throws RemoteException {
// TODO Auto-generated method stub
return mService.isInited();
}
@Override
public void registerCallback(IServiceCallback cb) throws RemoteException {
// TODO Auto-generated method stub
if (cb != null) mCallbacks.register(cb);
}
@Override
public void unregisterCallback(IDvbServiceCallback cb) throws RemoteException {
// TODO Auto-generated method stub
if (cb != null) mCallbacks.unregister(cb);
}
@Override
public void playerInit() throws RemoteException {
// TODO Auto-generated method stub
mService.playerInit();
}
@Override
public void play() throws RemoteException {
// TODO Auto-generated method stub
mService.play();
}
}
|
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
return mBinder;
}
|
private ServiceAidl mService; // service
private ServiceConnection mConnection;
// 鏈接service
private void initConnection() {
mConnection = new ServiceConnection(){
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// TODO Auto-generated method stub
mService = DvbServiceAidl.Stub.asInterface(service);
try {
mInitFlag = mService.isInited();
if(mInitFlag) {
mService.playerInit();
mService.registerCallback(mCallback); // 註冊消息回調
mService.setVideoScale(0, 272, 150, 930, 598); // 設置視頻大小和位置
mService.play(); // 播放
}
else {
exitService(); // 初始化失敗 退出
}
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
mService = null;
}
};
}
private void startDemoService() {
Intent intent = new Intent(
"com.demo.service.Service.START");
// remote service ,退出activity以後,也不中止service,因此這裏bind以後再start
// 具體查看
bindService 、startService以及bindService和startService 同時調用的區別
bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
startService (intent);
}
|
final static RemoteCallbackList<IServiceCallback> mCallbacks
= new RemoteCallbackList<IServiceCallback>();
|
package com.feiyue.dvbservice;
oneway interface IServiceCallback {
/*
* handler common message from service
*/
void handlerCommEvent(int msgID, int param);
/*
* handler search message from service
*/
void handlerSearchEvent(int msgID, in List<String> strList);
}
|
void registerCallback(IServiceCallback cb);
void unregisterCallback(IServiceCallback cb);
@Override
public void registerCallback(IDvbServiceCallback cb) throws RemoteException {
// TODO Auto-generated method stub
if (cb != null) mCallbacks.register(cb);
}
@Override
public void unregisterCallback(IDvbServiceCallback cb) throws RemoteException {
// TODO Auto-generated method stub
if (cb != null) mCallbacks.unregister(cb);
}
|
final int N = mCallbacks.beginBroadcast();
try { switch(service.status) { case Msg.SHOW__MSG: case Msg.HIDE__MSG: Bundle b = new Bundle(); ArrayList<String> strList = new ArrayList<String>(); b = msg.getData(); strList.add(b.getString("MSGTIP")); // 提示框消息 mCallbacks.getBroadcastItem(i).handlerSearchEvent(msg.what, strList); break; default: break; } } catch (RemoteException e) { // The RemoteCallbackList will take care of removing // the dead object for us. } }
mCallbacks.finishBroadcast();
|
private IServiceCallback mCallback = new IServiceCallback.Stub() {
@Override
public void handlerCommEvent(int msgID, int param) throws RemoteException {
// TODO Auto-generated method stub
Message msg = new Message();
msg.what = msgID;
msg.arg1 = param;
mHandler.sendMessage(msg);
}
@Override
public void handlerSearchEvent(int msgID, List<String> strList) throws RemoteException {
// TODO Auto-generated method stub
Message msg = new Message();
Bundle b = new Bundle();
msg.what = msgID;
switch (msgID) {
case Msg.SHOW_MSG:
case Msg.HIDE_MSG:
b.putString("MSGTIP",strList.get(0)); // ca提示框消息
break;
default:
break;
}
msg.setData(b);
mHandler.sendMessage(msg);
}
};
|
mService.unregisterCallback(mCallback);
if(mConnection != null) {
unbindService(mConnection);
mConnection = null;
}
|