如何将应用程序中的活动上下文传递给其他应用程序中的服务

时间:2012-09-20 21:13:45

标签: android service android-context

所以我在启动服务的应用程序中有一个活动:

private void startService() {
    if (started) {
        Toast.makeText(Main.this, "Service already started",
                Toast.LENGTH_SHORT).show();
    } else {
        Intent i = new Intent();
        i.setClassName("com.enorbitas.daemon.service",
                "com.enorbitas.daemon.service.DaemonService");
        startService(i);
        started = true;
        updateServiceStatus();
        Log.d(getClass().getSimpleName(), "startService()");
    }

}

该活动按以下意图启动:

<intent-filter>
            <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
        </intent-filter>

然后,该服务执行日志记录并与此自定义USB设备连接。为此,它需要活动上下文:

        mUsbManager = (UsbManager) parent.getSystemService(Context.USB_SERVICE);
        HashMap<String, UsbDevice> deviceList = mUsbManager.getDeviceList();
        Iterator<UsbDevice> deviceIterator = deviceList.values().iterator();
        while(deviceIterator.hasNext()){
            UsbDevice device = deviceIterator.next();
        }

        Intent intent = parent.getIntent();
        String action = intent.getAction();
        UsbDevice device = (UsbDevice) intent
                .getParcelableExtra(UsbManager.EXTRA_DEVICE);
        if (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(action)) {
            setDevice(device);
            Log.i(TAG, "usb conectado");
        } else if (UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action)) {
            if (mDevice != null && mDevice.equals(device)) {
                setDevice(null);
                Log.i(TAG, "usb NO conectado");
            }
        }

parent将是启动服务的活动。这种方法之前的工作方式是因为代码曾经在同一个应用程序中,但现在我希望它是一个服务,以便其他应用程序可以连接到它。

有没有办法将活动的上下文传递给服务?我阅读了很多关于意图和捆绑,可分割和序列化的内容,但它们都不适用于我。我需要传递上下文。

有什么想法吗?

3 个答案:

答案 0 :(得分:8)

每个Service都有自己的上下文,只需使用它。您无需传递服务和活动的上下文。

我不明白为什么你需要一个特定的Activity的上下文来调用getSystemService(),一个服务将像任何Activity一样容易地从BroadcastReceiver接收Intent。

此外,如果在此服务运行时销毁原始活动,则上下文将无效或活动将被泄露。

答案 1 :(得分:0)

  

如何将应用程序中的活动上下文传递给其他应用程序中的服务

这是不可能的。这些应用程序在单独的应用程序中的不同虚拟机中运行 - 您无法跨越这些边界传递对象。

答案 2 :(得分:0)

也许进程间通信可能会帮助你。

Some randomly googled Android IPC slides here