2012-09-20 25 views
5

Vì vậy, tôi có một hoạt động trong một ứng dụng bắt đầu một dịch vụ:Làm thế nào để vượt qua một bối cảnh hoạt động trong một ứng dụng vào một dịch vụ trong một ứng dụng khác

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()"); 
    } 

} 

Hoạt động này được đưa ra bởi mục đích sau:

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

Dịch vụ này sau đó ghi nhật ký và kết nối với thiết bị USB tùy chỉnh này. Để thực hiện điều đó, cần bối cảnh hoạt động:

 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"); 
      } 
     } 

cha mẹ sẽ là hoạt động bắt đầu dịch vụ. Cách tiếp cận này được sử dụng để làm việc vì mã đó được sử dụng trong cùng một ứng dụng, nhưng bây giờ tôi muốn nó là một dịch vụ để các ứng dụng khác có thể kết nối với nó.

Có cách nào để chuyển ngữ cảnh của hoạt động tới dịch vụ không? Tôi đọc rất nhiều về ý định và bó, có thể chuyển nhượng và tuần tự hóa, nhưng không cái nào hiệu quả với tôi. Tôi cần phải vượt qua bối cảnh.

Bất kỳ ý tưởng nào?

Trả lời

8

Mọi Service đều có ngữ cảnh riêng, chỉ cần sử dụng điều đó. Bạn không cần phải vượt qua Dịch vụ một Ngữ cảnh của Hoạt động.

Tôi không hiểu tại sao bạn cần một bối cảnh hoạt động cụ thể để gọi getSystemService() và Dịch vụ sẽ nhận được Intent từ BroadcastReceiver dễ dàng như mọi Hoạt động.

Ngoài ra nếu các Hoạt động có nguồn gốc bị phá hủy trong khi dịch vụ này đang chạy, bối cảnh sẽ là không hợp lệ hoặc Hoạt động sẽ được rò rỉ ...

+0

Vâng, tôi biết điều đó. Nhưng vấn đề là khi tôi nhận được ý định từ cha mẹ để có được .getParcelableExtra và yêu cầu thiết bị trả về null. Đối với tôi điều đó xảy ra bởi vì ý định bắt các tập tin đính kèm usb là một trong những từ hoạt động, không phải là dịch vụ. Tôi nghĩ đó là những gì đang xảy ra. Bạn có hiểu ý tôi không? – matiaslezin

+0

Nhưng BroadcastReceiver của bạn có thể chuyển trực tiếp thông tin này đến Dịch vụ, nó không cần phải được lưu trữ trong một Hoạt động. – Sam

+0

Vì tôi đã thử với ngữ cảnh của dịch vụ và tôi luôn nhận được con trỏ rỗng khi truy xuất đối tượng thiết bị USB. Bạn sẽ làm điều này như thế nào? Nếu một bộ dịch vụ để bắt ý định của usb attachement nó chỉ không bao giờ được gọi. Tôi không biết tại sao Android có vấn đề với bộ lọc mục đích cụ thể đó. – matiaslezin

0

Làm thế nào để vượt qua một bối cảnh hoạt động trong một ứng dụng vào một dịch vụ trong một ứng dụng khác

Điều này là không thể. Các ứng dụng này đang chạy trong các máy ảo riêng biệt trong các ứng dụng riêng biệt - bạn không thể vượt qua một đối tượng trên các ranh giới này.

Các vấn đề liên quan