2009-06-13 5 views
46

배경 (기본적으로 프록시 서버)에서 계속 실행되는 service 인 유일한 구성 요소를 만드는 중이지만 해당 서비스를 시작하는 방법을 찾을 수 없습니다. 응용 프로그램은 UI 또는 사용자 상호 작용을 가질 수 없으므로 Activity를 사용하지 않습니다.
Broadcast receiver은 BOOT 방송을들을 수 있지만 설치되었을 때 처음 서비스를 시작하려면 어떻게해야합니까? 앱을 설치 한 후 내가들을 수있는 방송이 있습니다. TIME_TICK 일 수도 있지만 생각한 활동을 통해 등록해야합니다.서비스 전용 Android 앱을 시작하는 방법

+1

본인 스스로 시도하지는 않았지만 Application 개체에서 서비스를 시작할 수 있습니까? – phreed

+0

나는 그것이 작동한다고 생각한다. http://android-codes-examples.blogspot.com/2011/11/running-service-in-background-on.html – Android

답변

43

불행히도 지금은 응용 프로그램이 설치된 후 브로드 캐스트 이벤트를 수신 할 수있는 확실한 방법이 없습니다. ACTION_PACKAGE_ADDED 인 텐트는 새로 설치된 패키지로 브로드 캐스트하지 않습니다.

ACTION_BOOT_COMPLETED 이벤트를 받으려면 방송 수신기 클래스와 서비스가 있어야합니다. 또한 해당 브로드 캐스트 리시버에 걸려는 ACTION_USER_PRESENT 의도를 추가하는 것이 좋습니다. Android 1.5 (minSDK = 3)가 필요합니다. 사용자가 휴대 전화를 잠금 해제 할 때마다 브로드 캐스트 수신기가 호출됩니다. 자동으로 쉽게 종료하지 않고 서비스를 계속 실행하기 위해 수행 할 수있는 마지막 작업은 서비스에서 Service.setForeground()으로 전화하는 것입니다. Android가 서비스를 중지하지 않아야 함을 알리려면이 서비스가 주로 mp3 플레이어 유형에 추가되어야합니다 서비스를 계속 실행해야하지만 모든 서비스에서 사용할 수있는 서비스

매니페스트의 boot_complete 및 user_present 이벤트에 대한 적절한 권한을 추가했는지 확인하십시오.

다음은 이벤트의 브로드 캐스트 리시버로 사용할 수있는 간단한 클래스입니다.

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)); 
      } 
     } 
    } 
}; 

행운을 빈다.

+7

좋은 조언. Service.setForeground()에 관한 한 가지 : Android 2.0 이상에서는 더 이상 작동하지 않습니다. 모든 "수명이 긴"서비스는 이제 알림 영역에서 실행 중일 때 지속적으로 알림을 받아야합니다. 예 : http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/ForegroundService.html –

+2

ACTION_USER_PRESENT는 멋진 팁입니다. 나는 여러 해 동안 내 봉사를 지키려고 애 쓰고 있었고 방금 해결했습니다. – defrex

+0

글쎄, 안드로이드 4.0.x에서 더 이상 작동하지 않는 것 같습니다 ... – ubuntudroid

14

Service.onStartCommand

에서 반환 START_STICKY 안드로이드 내가 같은 문제에 대해 연구하고 있습니다

+2

START_STICKY는 Android 2.0 이상에서만 유효합니다. – cow

+0

하지만 서비스가 연속성을 얻으려면 적어도 한 번 이상 실행해야합니까? –

0

서비스가 다시 시작됩니다. 여기 내가 찾은 무엇인가입니다 : http://kfb-android.blogspot.de/2009/04/registering-for-timetick-after-reboot.html

은 간단한 작은 데모는 BroadcatReceiverService 사이에 탁구의 조금을 재생하여 솔루션을 보여줍니다. 수신기는 매니페스트에 등록하여 ACTION_BOOT_COMPLETED을 수신하면 부팅 할 때 시작되도록 등록됩니다. 수신 ACTION_BOOT_COMPLETED을 수신하면 서비스가 시작됩니다. Service은 차례로 BroadcastReceiver을 등록하고 ACTION_TIME_TICK을 등록합니다.

앱 로직은 BroadcastReceiver에 구현됩니다.

관련 문제