2009-06-13 30 views
46

Tôi đang tạo một ứng dụng chỉ có thành phần là service tiếp tục chạy ở chế độ nền (về cơ bản là máy chủ proxy) nhưng tôi không thể tìm cách bắt đầu dịch vụ đó. Ứng dụng không thể có bất kỳ giao diện người dùng hoặc tương tác người dùng nào nên tôi không sử dụng Hoạt động.
Broadcast receiver có thể nghe phát sóng BOOT nhưng làm thế nào để tôi bắt đầu dịch vụ lần đầu tiên khi cài đặt và cách tôi có thể tiếp tục chạy? hoặc có một chương trình phát mà tôi có thể nghe sau khi ứng dụng được cài đặt, ví dụ: có thể là TIME_TICK nhưng điều đó phải được đăng ký từ hoạt động tôi nghĩ.Cách khởi động ứng dụng Android chỉ dành cho Dịch vụ

+1

Tôi chưa thử bản thân mình nhưng có thể bắt đầu dịch vụ từ đối tượng Ứng dụng không? – phreed

+0

Tôi nghĩ rằng nó hoạt động http://android-codes-examples.blogspot.com/2011/11/running-service-in-background-on.html – Android

Trả lời

43

Thật không may ngay bây giờ không có cách nào đáng tin cậy để nhận sự kiện phát sóng sau khi ứng dụng của bạn đã được cài đặt, Mục đích ACTION_PACKAGE_ADDED không phát tới gói mới được cài đặt.

Bạn sẽ phải có lớp người nhận chương trình phát sóng cũng như dịch vụ của mình để nhận sự kiện ACTION_BOOT_COMPLETED. Tôi cũng khuyên bạn nên thêm ý định ACTION_USER_PRESENT bị máy thu phát phát hiện, điều này yêu cầu Android 1.5 (minSDK = 3), điều này sẽ gọi bộ thu phát của bạn bất cứ khi nào người dùng mở khóa điện thoại của họ. Điều cuối cùng mà bạn có thể làm để cố gắng giữ cho dịch vụ của mình hoạt động mà không cần phải tắt tự động là gọi Service.setForeground() trong dịch vụ của bạn trênCreate để cho Android biết rằng dịch vụ của bạn không nên dừng lại, điều này được thêm chủ yếu cho loại máy nghe nhạc mp3 các dịch vụ phải tiếp tục chạy nhưng có thể được sử dụng bởi bất kỳ dịch vụ nào.

Đảm bảo bạn thêm quyền thích hợp cho các sự kiện boot_complete và user_present trong tệp kê khai của bạn.

Đây là một lớp đơn giản mà bạn có thể sử dụng làm bộ thu phát sóng cho các sự kiện.

package com.snctln.util.WeatherStatus; 

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 

public class WeatherStatusServiceReceiver extends BroadcastReceiver 
{ 
    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
     if(intent.getAction() != null) 
     { 
      if(intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED) || 
       intent.getAction().equals(Intent.ACTION_USER_PRESENT)) 
      { 
       context.startService(new Intent(context, WeatherStatusService.class)); 
      } 
     } 
    } 
}; 

Chúc may mắn.

+7

Lời khuyên tốt. Một điều về Service.setForeground(): nó không còn hoạt động trong Android 2.0+. Tất cả các dịch vụ "tồn tại lâu" bây giờ bắt buộc phải có thông báo liên tục trong vùng thông báo khi chúng đang chạy. Ví dụ ở đây: http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/ForegroundService.html –

+2

ACTION_USER_PRESENT là một mẹo tuyệt vời. Tôi đã đấu tranh với việc giữ cho dịch vụ của tôi còn sống cho các lứa tuổi, và điều này chỉ giải quyết được nó. – defrex

+0

Vâng, điều này dường như không hoạt động trong Android 4.0.x nữa ... – ubuntudroid

14

Return START_STICKY trong Service.onStartCommand

Android sẽ khởi động lại dịch vụ của bạn

+2

START_STICKY chỉ hợp lệ cho Android 2.0+ – cow

+0

nhưng dịch vụ phải chạy ít nhất một lần để có được quyền liên tục? –

0

Tôi đang nghiên cứu về vấn đề tương tự. Dưới đây là là những gì tôi đã tìm thấy: http://kfb-android.blogspot.de/2009/04/registering-for-timetick-after-reboot.html

Đó đơn giản bản demo nhỏ cho thấy một giải pháp bằng cách chơi một chút ping-pong giữa một BroadcatReceiverService. Người nhận được đăng ký để bắt đầu tại thời điểm khởi động bằng cách đăng ký trong Manifest để nhận ACTION_BOOT_COMPLETED. Nó chỉ bắt đầu một dịch vụ khi receviving ACTION_BOOT_COMPLETED. Lần lượt Service đăng ký BroadcastReceiver rồi cho số ACTION_TIME_TICK.

Logic ứng dụng sẽ được triển khai trong BroadcastReceiver.

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