0

在我正在处理的应用程序上,onCreate 使用 startService() 启动服务,随后,相同的活动在其 onStart 中调用 bindService(到相同的服务)。问题是服务直到 onStart 完成后才初始化,这会导致由空服务引起的空指针异常导致致命错误。如果不使用半途而废的解决方案,我不知道如何解决这个问题,而且我不知道 onStart 在 onCreate 之前是如何完成的。

建议?任何帮助深表感谢。

public class PNetworkService extends Service {
private final IBinder binder = new NtwkSvcBinder(this);


@Override
public void onCreate() {
    // Creates a HandlerThread to process the network events.
    HandlerThread handlerThread = new HandlerThread("SystemStartService",
            Process.THREAD_PRIORITY_BACKGROUND);
    // Starts the network thread.
    handlerThread.start();
    // Obtains looper so that that the NetworkServiceHandler is bound to that looper.
    serviceLooper = handlerThread.getLooper();
    // Create the Network Service Handler.
    nsh = new NetworkServiceHandler(serviceLooper, this);
    messenger = new Messenger(nsh);
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    Log.i(TAG, "onStartCommand");
    return START_STICKY;
}

@Override
public IBinder onBind(Intent i) {
    Log.i(TAG, "onBind called");
    return binder;
}

public void setExtHandler(Handler extHandler) {
    Log.i(TAG, "setting exthandler");
        nsh.setExtHandler(extHandler);
}
}
4

1 回答 1

4

我认为主要问题是您假设在 Activity 的 onStart 执行时服务已经在运行,并期望 bindService 立即绑定。但是,通常它不起作用。

这种行为的原因,我认为是Android一个一个实例化组件,认为你不能在Activity的onCreate里面同步创建服务。肯定会创建它,但是在系统队列之后会去创建这个新的服务。

那么,如果您只提供正确的 Connection 处理来绑定服务,它会起作用吗?例如移动以下代码

mConnection.getService().setExtHandler(mapActivityHandler);

到里面onServiceConnected()

于 2012-09-02T11:14:37.780 回答