2012-04-16 34 views
6

Tôi đang viết một ứng dụng SIP sử dụng SDK. Ứng dụng của tôi có nhiều Hoạt động và vì vậy tôi khởi tạo và tắt SDK bằng cách sử dụng các phương thức onCreate và onDestroy của dịch vụ để tôi có thể chạy nó trong suốt thời gian Ứng dụng của tôi (không chỉ một Hoạt động riêng lẻ).Tôi làm cách nào để chia sẻ một dịch vụ giữa các hoạt động mà không cần khởi động lại?

Các ví dụ ứng dụng Tôi đang làm việc từ các cuộc gọi startService và sau đó chỉ cần rò rỉ dịch vụ - Tôi không muốn làm điều này nhưng tôi không chắc chắn rằng tôi có một sự thay thế.

Điều tôi sẽ như cần làm là liên kết với dịch vụ bằng cách sử dụng Ngữ cảnh.BIND_AUTO_CREATE trong phương thức OnCreate của lớp cơ sở Hoạt động của tôi và hủy liên kết trong OnDestroy. Tất cả các Hoạt động của tôi mở rộng từ điều này, vì vậy tôi sẽ có Dịch vụ trong tất cả các Hoạt động của tôi.

Nhưng, những gì sẽ xảy ra khi những thay đổi cấu hình hoặc tôi chuyển sang hoạt động? Dịch vụ có bị xâm phạm mạnh trong khoảng thời gian ngắn giữa các hoạt động hoặc có đảm bảo rằng dịch vụ đó sẽ không hoạt động? Nếu nó là cũ, không phải là hơi làm tê liệt việc sử dụng các dịch vụ? Tôi nên sử dụng mẫu thiết kế nào để tạo một thứ gì đó tồn tại cho chính xác tuổi thọ của Đơn đăng ký của tôi?

Trả lời

3

Tôi đã nhận ra rằng tôi đang đặt ra câu hỏi sai. Tôi giả định rằng Ứng dụng sẽ bị hủy khi người dùng kết thúc với nó, điều mà có lẽ nó sẽ không xảy ra, nó sẽ chỉ ở chế độ nền và dịch vụ của tôi cũng vậy. Tôi nghĩ tôi cần thiết kế lại. Hơn nữa, nếu tôi thực sự muốn tiếp tục con đường đó (mà bây giờ tôi không làm), tôi có thể liên kết dịch vụ với ứng dụng của tôi, nó sẽ tồn tại trong suốt thời gian của ứng dụng (như tôi nhớ, sẽ không xác định trừ khi người dùng giết nó hoặc Android reclaims nó). Trong trường hợp này, tôi không cần phải gọi cụ thể là unbind, vì ràng buộc sẽ bị hủy cùng với ứng dụng.

2

Trong hoạt động, bắt đầu Dịch vụ sử dụng startService()cũng ràng buộc với dịch vụ. Điều này sẽ giữ cho dịch vụ của bạn còn sống nếu có thay đổi cấu hình.

Hủy liên kết khỏi dịch vụ trong onDestroy() hoạt động của bạn. Dịch vụ sẽ vẫn chạy khi bạn bắt đầu nó không chỉ bị ràng buộc với nó.

Giữ một biến truy cập tĩnh trong hoạt động phóng của bạn. Tăng nó lên 1 để khởi động hoạt động khác trong số onCreate() và giảm số đó xuống một trong số onDestroy(). Vì vậy, nếu 3 hoạt động đã được mở và giả sử rằng bạn đang giữ 2 khác trong backstack, truy cập tĩnh là ba. Bây giờ trong onDestroy() của mỗi lần giảm bộ đếm và kiểm tra xem nó có bằng không, dừng dịch vụ.

Trong FirstActivity tôi (Launcher), tôi có public static int counter = 0;

sau đó trong mỗi Hoạt động:

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

    FirstActivity.counter++; 
} 

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

    if (--FirstActivity.counter == 0) { 
     stopService(new Intent(this, MyService.class)); 
    } 
} 
+0

Và làm cách nào để tôi gọi stopService theo cách bạn đề xuất? Không có cách nào để phát hiện các ứng dụng đóng cửa, nếu có tôi sẽ không cần một dịch vụ, tôi chỉ cần đặt nó trong ứng dụng! – pjcard

+0

Và tôi nói "có", có cách. Để nhận được Vòng đời ứng dụng, bạn cần tạo một lớp Ứng dụng tùy chỉnh mở rộng Ứng dụng và đăng ký nó là biểu hiện. Tôi quên đề cập đến nó trong câu trả lời.Và có, bạn có thể không cần một dịch vụ nào cả vì bạn đang hạn chế nó trong vòng đời của ứng dụng. Xem ans bởi Reto Meier tại đây: http://stackoverflow.com/questions/456211/activity-restart-on-rotation-android – Akhil

+0

Xin lỗi Akhil, điều đó vẫn không đúng. Tôi đã có một lớp ứng dụng tùy chỉnh nhưng nó không có phương thức để phát hiện ứng dụng thoát. Xem phần "Bổ sung" của tôi về câu hỏi vì lý do này. – pjcard

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