2010-09-19 47 views
18

Vì vậy, tôi thực sự bối rối về cách thực hiện toàn bộ điều này và tôi hy vọng một người nào đó có thể phá vỡ nó cho tôi một chút.Android: Chuyển dữ liệu giữa dịch vụ và hoạt động

Tôi có một dịch vụ phải luôn chạy, và vào những thời điểm nhất định cần phải thông báo cho người dùng rằng công việc sẽ được hoàn thành (có thể thông qua biểu tượng trên thanh thông báo). Khi người dùng chấp nhận tác vụ, dịch vụ cần xem xét cơ sở dữ liệu cục bộ, xây dựng một số đối tượng không nguyên thủy và cung cấp cho họ hoạt động mà nó vừa mới bắt đầu.

Tôi đã xem xét tất cả và nhận được rất bối rối như một cách tiếp cận thích hợp vì vậy tôi có một vài câu hỏi để giúp tôi quấn quanh đầu của tôi xung quanh nó.

  1. Nếu một hoạt động tạo cơ sở dữ liệu SQLite cục bộ, dịch vụ và hoạt động của ứng dụng đó có thể truy cập cùng cơ sở dữ liệu đó sau không?

  2. Dịch vụ và hoạt động có cần phải nằm trong cùng một gói hoặc gói riêng không? Tôi sẽ nghĩ không, nhưng vì một lý do nào đó tôi nhớ đã nhìn thấy một cái gì đó về điều này ở nơi khác.

  3. Tôi làm cách nào để truyền dữ liệu từ dịch vụ đến hoạt động? Tôi đã suy nghĩ một nhà cung cấp nội dung nhưng có vẻ như có một cách dễ dàng hơn cho các dịch vụ để chỉ tay tắt các dữ liệu. Tương tự như Intent nhưng không phải nguyên thủy.

Xin cảm ơn trước.

Trả lời

12
  1. Nếu lớp Dịch vụ và hoạt động ở cùng gói, tôi tin rằng họ có thể truy cập cùng một không gian lưu trữ riêng tư.

  2. Tôi sẽ đặt chúng trong cùng một gói vì chúng là một phần của cùng một cấu trúc ứng dụng tổng thể.

  3. Kết hợp dữ liệu vào phần phụ của Intent dưới dạng cặp khóa-giá trị và bắt đầu hoạt động.


Intent intent = new Intent(this, SecondActivity.class); 
Bundle b = new Bundle(); 

// see Bundle.putInt, etc. 
// Bundle.putSerializable for full Objects (careful there) 
b.putXXXXX("key", ITEM); 
intent.putExtras(b); 
startActivity(intent); 

// -- later, in Activity 
Bundle b = this.getIntent().getExtras(); 
int i = b.getInt("key"); 
+6

phải làm gì nếu cả hai gói này không cùng gói? – Nirav

+2

@Nirav: Intent intent = new Intent (this, com.example.somepackage.SecondActivity.class); –

5

Trong cùng một ứng dụng, dịch vụ và các hoạt động có thể truy cập cơ sở dữ liệu Sqlite cùng. Tôi muốn đề nghị sử dụng một db sqlite. Để đơn giản, hãy thiết lập kết nối dịch vụ của bạn với tư cách là một địa phương, do đó bạn không cần giao diện AIDL và các công cụ giao tiếp liên công nghệ.

Từ một dịch vụ, để thông báo cho người dùng, hãy sử dụng Trình quản lý thông báo. Bạn có thể truyền một đối tượng tuần tự hóa từ dịch vụ của bạn đến một mục đích, sau đó đến hoạt động được bắt đầu, nhưng tôi khuyên bạn nên chuyển một ID db thay thế.

Chúng tôi đã tạo một công cụ ORM Android mới mà bạn có thể sử dụng cho việc này. Nó bao gồm các lớp Hoạt động và Lớp dịch vụ nguyên mẫu mà bạn có thể sử dụng để tạo ứng dụng của mình. Tôi chưa có một ứng dụng mẫu nào sử dụng dịch vụ, nhưng tôi sẽ viết mã cho ứng dụng đó và tiếp tục ASAP.

Xem ...

http://ormlite.com/

Và blog của tôi ...

http://touchlabblog.tumblr.com/

Tôi hiện đang làm một số công cụ db khá nặng trong ứng dụng tôi đang làm việc trên. Một dịch vụ sẽ kiểm tra với một máy chủ để cập nhật, và về cơ bản là những gì bạn đang tìm kiếm. Tất cả những thứ khá đơn giản của nó.

+1

Cập nhật! Tôi đã tạo một ứng dụng mẫu với một dịch vụ "làm công cụ". Tôi chưa đặt nó vào kho svn, nhưng bạn có thể tải nó và cho nó xoáy. Hãy cẩn thận. Không có nút "tắt" cho dịch vụ ... http://www.kagii.com/downloads/NotifyService.tar.gz –

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