2012-10-10 67 views
5

Tôi muốn khởi chạy Service khi ứng dụng được khởi chạy thay vì Hoạt động; và sau đó cho biết Dịch vụ sẽ khởi chạy an Activity. Tôi cần phải làm điều này vì ứng dụng của tôi cần phải chạy LUÔN LUÔN, và khi tôi nói LUÔN LUÔN tôi có nghĩa là LUÔN LUÔN. Và cách duy nhất tôi quản lý để tránh hệ điều hành giết ứng dụng của tôi là bắt đầu một dịch vụ như Sticky và Android nên giết Activity hoặc Dịch vụ của tôi, tôi sẽ khởi động lại chúng ngay lập tức.Khởi chạy dịch vụ từ khởi động ứng dụng, không hoạt động

Tôi tìm thấy điều này question nhưng câu trả lời hàng đầu có vẻ khá vụng về, bất kỳ ai có ý tưởng tốt hơn?

PS: Tôi biết điều này không giống như một ứng dụng rất thân thiện nhưng đây là một kịch bản nghiên cứu rất cụ thể và nó không dành cho người dùng thông thường, tức là điện thoại chỉ được sử dụng cho mục đích này; nhưng ngay cả khi bộ nhớ được dành riêng cho ứng dụng của tôi, Android vẫn tiếp tục giết nó mọi lúc rồi ... Bất kỳ nghi ngờ nào tôi có thể có về kế hoạch quản lý bộ nhớ nghiêm ngặt của Android hiện đã biến mất.

+0

vì vậy, bạn muốn biết làm thế nào để bắt đầu một dịch vụ? – keyser

+0

@roadkarom: có ** NO ** UI trong Hoạt động. Có ** CÓ THỂ ** UI trong hoạt động - và điều này làm cho sự khác biệt rất lớn. –

+0

Tôi bây giờ nhận thấy điều đó. Lỗi của tôi. –

Trả lời

10

Nói chung Hoạt động KHÔNG phải hiển thị bất kỳ giao diện người dùng nào - nó thường có nhưng KHÔNG bắt buộc phải. Vì vậy, bạn chỉ có thể đặt điểm bắt đầu của ứng dụng thành hoạt động "ẩn". Và các phương tiện vô hình hoặc theo chủ đề như

android:theme="@android:style/Theme.NoDisplay" 

hoặc đơn giản là mã của bạn sẽ không làm bất cứ setContentView() và một khi đó là công việc được thực hiện trong onCreate() của bạn, bạn bắt đầu hoạt động khác và chấm dứt cái này với finish() - và không có giao diện người dùng sẽ bật lên từ rằng hoạt động - cách mà bạn có thể dễ dàng được hưởng lợi từ việc làm của mình trong hoạt động lớp con (có thể đơn giản hơn đối với một số nhiệm vụ) và vẫn không cần bất kỳ giao diện người dùng:

public void onCreate(Bundle bundle) { 
    super.onCreate(bundle); 

    // [... do your job here...] 

    // we're done, so let's jump to another acitivity 
    // this can be skipped if you do not want to jump anywhere 

    Intenet intent = new Intent(....) 
    ... 

    try { 
     startActivity(intent); 

     // finish him 
     finish(); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

} 
+0

Nhưng sau đó bắt buộc phải bắt đầu Hoạt động? Không thể bỏ qua bước đó? –

+2

@rodkarom: Biểu tượng trình khởi chạy luôn gắn liền với hoạt động. Do đó, nếu bạn muốn biểu tượng trình khởi chạy kích hoạt dịch vụ, biểu tượng trình khởi chạy cần phải bắt đầu một hoạt động kích hoạt dịch vụ. Điều này, tất nhiên, giả định rằng bởi "khi ứng dụng được khởi chạy", bạn có nghĩa là "khi người dùng chạm vào biểu tượng trình khởi chạy", vì "ứng dụng" không được "khởi chạy" trong Android. – CommonsWare

+0

Bí quyết là để khởi động hệ thống ứng dụng sẽ gọi ra rằng yếu tố mà đã đúng 'intent-filter' gắn liền với nó. Về mặt lý thuyết, vì bộ lọc intenet có thể được gán cho hoạt động, dịch vụ hoặc phát sóng, bất kỳ đối tượng nào thuộc loại đó có thể được khởi chạy (tuy nhiên tôi không thử bất cứ thứ gì bên cạnh hoạt động cho ý định của Trình khởi chạy). Tuy nhiên, tôi thấy không có vấn đề khi khởi chạy hoạt động mà không có giao diện người dùng chỉ để thực hiện công việc thiết lập của tôi. –

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