2010-05-07 38 views
16

Điều quan trọng là dịch vụ của tôi vẫn hoạt động cho đến khi ai đó có mật khẩu ngừng dịch vụ từ màn hình giao diện người dùng của tôi. Ứng dụng của tôi chạy rất tốt nhưng ứng dụng được thiết kế để bật/tắt bởi cha mẹ (bằng mật khẩu) trên điện thoại con cái của họ. Tôi đã xoay xở để làm mọi việc nhưng vấn đề tôi gặp phải là nếu đứa trẻ sử dụng một người quản lý nhiệm vụ để giết dịch vụ của tôi thì ứng dụng của tôi là vô ích. Tôi sẽ biết ơn bất kỳ ai biết cách đểLàm cách nào để ngăn ứng dụng/dịch vụ Android của tôi bị "giết" khỏi trình quản lý tác vụ?

1) theo dõi dịch vụ và tự động sao lưu nếu dịch vụ "bị giết" hoặc 2) ngăn người khác có thể giết nó ngoại trừ hoạt động (màn hình quản trị) đã khởi chạy dịch vụ. Hoặc cả hai?

Tôi xin lỗi nếu tôi không mô tả rõ vấn đề, tôi là người mới bắt đầu. Tôi đã đạt được tiến bộ lớn cho đến nay nhưng tôi đang mắc kẹt ở rào cản cuối cùng này.

Trả lời

5

Không có cách nào để ngăn điều này trực tiếp, không có thiết bị gốc. SDK giúp ngăn chặn các vấn đề này một cách hữu ích.

Bạn có thể thực hiện thủ thuật "thực sự độc ác" và có hai dịch vụ trong hai ứng dụng. Mỗi dịch vụ giám sát người khác và khởi động lại nó nếu nó dừng lại. Đây là kludgy, nhưng trong hầu hết các trường hợp, ngay cả những đứa trẻ ngón tay nhanh nhất cũng không thể giết cả hai ứng dụng.

+3

Nhưng một chương trình có thể! Bất kỳ chương trình nào có thể thực hiện tương đương 'kill -KILL -1' đều có thể khiến tất cả các trường hợp của bạn chết cùng một lúc. –

+1

Nếu bạn có đặc quyền của hệ thống, bạn sẽ đăng ký ứng dụng của mình theo cách ẩn hoặc loại bỏ khả năng của người dùng? có bất kỳ quyền cụ thể nào mà bạn phải đặt không? – rayman

+3

Tôi vừa cài đặt một ứng dụng có tên Smart App Protector Free, nó sẽ hỏi bạn xem bạn có muốn cài đặt trình trợ giúp hơn là ngăn không cho nó bị giết. Nó hoạt động và tôi tự hỏi nó như thế nào. Tôi sử dụng Panel hệ thống để tiêu diệt mọi thứ (bao gồm cả quá trình hệ thống) nhưng bộ bảo vệ vẫn quay trở lại. Thậm chí nhiều hơn, tôi không thể nhìn thấy dấu vết của helper đang chạy, không phải trong System Panel, và thậm chí tôi ps trong giao diện điều khiển thiết bị (thông qua adb), tôi vẫn không thể thấy helper đó tồn tại. Bất kỳ gợi ý nào? – xandy

10

Bạn có thể sử dụng phương pháp API: startForeground(). Dưới đây là lời giải thích của nó:

Một bắt đầu dịch vụ có thể sử dụng startForeground (int, Notification) API để đưa dịch vụ trong tình trạng tiền cảnh, nơi mà hệ thống xem xét nó là một cái gì người dùng đang tích cực nhận thức và do đó không phải là ứng cử viên để giết khi bộ nhớ thấp. (Nó vẫn còn trên lý thuyết nhất có thể cho các dịch vụ bị giết dưới áp lực bộ nhớ cực từ ứng dụng đang chạy hiện tại, nhưng trong thực tế này nên không phải là một mối quan tâm.)

Here bạn có thể tìm thấy một ví dụ làm thế nào để dùng cái này.

Đối với câu hỏi, bạn không thể ngăn dịch vụ bị giết. Nó có thể bị giết bởi hệ thống. Ngay cả các dịch vụ hệ thống cũng có thể bị giết. Nếu điều này xảy ra, chúng sẽ được khởi động lại. Bạn có thể sử dụng cùng một cách tiếp cận.

5

Bạn có thể viết ứng dụng trợ giúp để nhận phát sóng android "android.intent.action.PACKAGE_RESTARTED", khi ứng dụng của bạn bị giết, người trợ giúp của bạn sẽ nhận được chương trình phát đó và bạn có thể khởi động lại ứng dụng của mình hoặc bất kỳ thứ gì.

Đó là cách 'Smart App Protector Free' thực hiện.

Điều xấu là người dùng phải cài đặt hai ứng dụng thay vì một ứng dụng.

3

Đối với những ai vẫn đang tìm kiếm một câu trả lời - một trong những điều này có thể đúng:

bạn không thể: thực hiện một dịch vụ unkillable, nếu chạy trên bộ nhớ thấp hệ thống sẽ luôn luôn giết dịch vụ của bạn. NHƯNG

bạn có thể: Yêu cầu Hệ thống khởi động lại dịch vụ của bạn khi nó bị giết.Nhìn vào đoạn mã này:

public static thức int START_REDELIVER_INTENT

gia tăng ở mức API 5

liên tục để trở về từ onStartCommand (Ý định, int, int):

nếu quá trình của dịch vụ này bị giết trong khi nó được khởi động (sau khi trở về từ onStartCommand (Intent, int, int)), thì nó sẽ được lên lịch khởi động lại và Intent được giao lại lần cuối cho nó một lần nữa thông qua onStartCommand (Intent, int, int). Mục đích này sẽ vẫn được lập lịch để phân phối lại cho đến khi dịch vụ gọi stopSelf (int) với ID bắt đầu được cung cấp cho onStartCommand (Intent, int, int). Dịch vụ sẽ không nhận được cuộc gọi onStartCommand (Intent, int, int) với một Intent null vì nó sẽ chỉ được khởi động lại nếu nó chưa xử lý xong tất cả Intents được gửi đến nó (và bất kỳ sự kiện đang chờ xử lý nào sẽ được gửi tại điểm khởi động lại).

Giá trị không đổi: 3 (0x00000003)

0

Chỉ cần đặt loại trả về là START_TICKY.

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