Serviço remoto, vazamentos de atividade ao girar
Eu tenho um problema com um callbacks no serviço remoto, depois de registrar uma rotação de retorno de chamada causar um vazamento de atividade. Você pode me dar alguma sugestão do que estou fazendo de errado?
IRemoteApi.aidl
import com.example.remoteservice.IRemoteListener;
interface IRemoteApi{
void addListener(IRemoteListener listener);
void removeListener(IRemoteListener listener);
void sendRequest(String msg);
}
IRemoteListener.aidl
interface IRemoteListener {
void onMessage(String text);
}
RemoteService.java
public class RemoteService extends Service {
private static final String TAG = RemoteService.class.getSimpleName();
final RemoteCallbackList<IRemoteListener> mCallbacks = new RemoteCallbackList<IRemoteListener>();
@Override
public void onCreate() {
super.onCreate();
Log.e(TAG, "Create service...");
}
@Override
public void onDestroy() {
super.onDestroy();
mCallbacks.kill();
}
private void dumpMethod(String msg){
if(msg.equals("OK")){
final int N = mCallbacks.beginBroadcast();
for (int i=0; i<N; i++) {
try {
mCallbacks.getBroadcastItem(i).onMessage("Voila!");
} catch (RemoteException e) {}
}
mCallbacks.finishBroadcast();
}
}
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
private IRemoteApi.Stub mBinder = new IRemoteApi.Stub() {
@Override
public void addListener(IRemoteListener listener) throws RemoteException {
if (listener != null) mCallbacks.register(listener);
}
@Override
public void removeListener(IRemoteListener listener) throws RemoteException {
if (listener != null) mCallbacks.unregister(listener);
}
@Override
public void sendRequest(String msg) throws RemoteException {
dumpMethod(msg);
}
};
}
MainActivity.java
public class MainActivity extends ActionBarActivity {
private static final String TAG = MainActivity.class.getSimpleName();
IRemoteApi mService;
boolean isBound = false;
private ServiceConnection mServiceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
mService = IRemoteApi.Stub.asInterface(service);
isBound = true;
Log.e("merhold", "Bound to service");
try {
mService.addListener(serviceListener);
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getApplicationContext().startService(new Intent(RemoteService.class.getName()));
getApplicationContext().bindService(new Intent(RemoteService.class.getName()), mServiceConnection, Context.BIND_AUTO_CREATE);
}
@Override
protected void onDestroy() {
super.onDestroy();
if(isBound){
try {
mService.removeListener(serviceListener);
getApplicationContext().unbindService(mServiceConnection);
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
public void sendRequest(View view) {
try {
mService.sendRequest("OK");
} catch (RemoteException e) {
e.printStackTrace();
}
}
private IRemoteListener serviceListener = new IRemoteListener.Stub(){
@Override
public void onMessage(String text) throws RemoteException {
Log.e(TAG, "Message from listener: "+text);
}
};
}