Android 我可以';我不想弄明白:

Android 我可以';我不想弄明白:,android,service,abstract-class,factory,Android,Service,Abstract Class,Factory,我有以下抽象类: public abstract class AbstractService extends Service { @Override public IBinder onBind(Intent intent) { return null; } } 该类由另外两个类扩展: public abstract class AbstractMessengerService extends AbstractService { static final int MSG_REGISTE

我有以下抽象类:

public abstract class AbstractService extends Service {

@Override
public IBinder onBind(Intent intent) {
    return null;
}
}
该类由另外两个类扩展:

public abstract class AbstractMessengerService extends AbstractService {
static final int MSG_REGISTER_CLIENT = 9991;
static final int MSG_UNREGISTER_CLIENT = 9992;

ArrayList<Messenger> mClients = new ArrayList<Messenger>(); // Keeps track of all current registered clients.
final Messenger mMessenger = new Messenger(new IncomingHandler()); // Target we publish for clients to send messages to IncomingHandler.

private class IncomingHandler extends Handler { // Handler of incoming messages from clients.
    @Override
    public void handleMessage(Message msg) {
        switch (msg.what) {
            case MSG_REGISTER_CLIENT:
                Log.i("MyService", "Client registered: " + msg.replyTo);
                mClients.add(msg.replyTo);
                break;
            case MSG_UNREGISTER_CLIENT:
                Log.i("MyService", "Client un-registered: "+msg.replyTo);
                mClients.remove(msg.replyTo);
                break;
            default:
                //super.handleMessage(msg);
                onReceiveMessage(msg);
        }
    }
}

@Override
public void onCreate() {
    super.onCreate();

    onStartService();

    Log.i("MyService", "Service Started.");
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    Log.i("MyService", "Received start id " + startId + ": " + intent);
    return START_STICKY; // run until explicitly stopped.
}

@Override
public IBinder onBind(Intent intent) {
    return mMessenger.getBinder();
}

@Override
public void onDestroy() {
    super.onDestroy();

    onStopService();

    Log.i("MyService", "Service Stopped.");
}

protected void send(Message msg) {
    for (int i=mClients.size()-1; i>=0; i--) {
        try {
            Log.i("MyService", "Sending message to clients: "+msg);
            mClients.get(i).send(msg);
        }
        catch (RemoteException e) {
            // The client is dead. Remove it from the list; we are going through the list from back to front so this is safe to do inside the loop.
            Log.e("MyService", "Client is dead. Removing from list: "+i);
            mClients.remove(i);
        }
    }
}

public abstract void onStartService();
public abstract void onStopService();
public abstract void onReceiveMessage(Message msg);

}

但由于某些原因,这些行:
this.mServiceClass=(AbstractAIDLService)serviceClass
this.mServiceClass=(AbstractMessengerService)服务类给我一个铸造问题。如何做到这一点?

我认为在您的
ServiceManager
中,您不能将
AbstractAIDLService
AbstractMessenger服务
分配给
类是的,我确实可以这样做,但我想做的是将传递类的具体类,而不是抽象类,传递给ServiceManager中的构造函数。我知道的唯一解决方案是创建两个getter方法,两种类型各一个,因为如果只有一个getter,则需要返回超级抽象类:
AbstractService getService()
public abstract class AbstractAIDLService extends AbstractService {
private Handler handler;
ArrayList<Messenger> mClients = new ArrayList<Messenger>(); // Keeps track of all current registered clients.

private final IRemoteService.Stub mBinder = new IRemoteService.Stub() {
    public int getPid(){
        return  android.os.Process.myPid();
    }

    @Override
    public void setActivityColor(String color, long startTime) throws RemoteException {
        long elpsedTime = (System.nanoTime() - startTime) / (1000 * 1000);
        showElpesedTime(String.valueOf(elpsedTime));
    }

    public void basicTypes(int anInt, long aLong, boolean aBoolean,
                           float aFloat, double aDouble, String aString) {
        // Does nothing
    }
};

private void showElpesedTime(final String time)
{
    handler.post(new Runnable() {
        public void run() {
            Toast toast = Toast.makeText(AbstractAIDLService.this, "Time passed reaching the server: "+time+"ms", Toast.LENGTH_SHORT);
            toast.show();
        }
    });
}

@Override
public void onCreate() {
    super.onCreate();
    onStartService();
    Log.i("MyService", "Service Started.");
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    Log.i("MyService", "Received start id " + startId + ": " + intent);
    return START_STICKY; // run until explicitly stopped.
}

@Override
public IBinder onBind(Intent intent) {
    return mBinder;
}


@Override
public void onDestroy() {
    super.onDestroy();

    onStopService();

    Log.i("MyService", "Service Stopped.");
}

public abstract void onStartService();
public abstract void onStopService();
public abstract void onReceiveMessage(Message msg);

}
public class ServiceManager {

private static final String TAG = ServiceManager.class.getSimpleName();
private Class<? extends AbstractService> mServiceClass;

  public ServiceManager(Context context, ServiceType type, Class<? extends AbstractService> serviceClass, Handler incomingHandler) {
    this.mActivity = context;

    this.mIncomingHandler = incomingHandler;
    if (type.equals(ServiceType.AIDL)) {
        this.mServiceClass = (AbstractAIDLService) serviceClass;
    } else if (type.equals(ServiceType.MESSENGER)) {
        this.mServiceClass = (AbstractMessengerService) serviceClass;
    }

    if (isRunning()) {
        doBindService();
    }
}
public class ServiceManager {

private static final String TAG = ServiceManager.class.getSimpleName();
private AbstractService mServiceClass;

  public ServiceManager(Context context, ServiceType type, AbstractService serviceClass, Handler incomingHandler) {
    this.mActivity = context;

    this.mIncomingHandler = incomingHandler;

    this.mServiceClass = serviceClass;


    if (isRunning()) {
        doBindService();
    }
}