2016-12-30 3 views
0

일부 안드로이드 코드를 상속 받았으며 서비스를 확장하는 클래스가 있지만 매니페스트에 선언되어 있지 않습니다. 나는 이것이 방해가되는 것을 안다. 나는 더 조사해 보았는데 서비스가 선언서에 선언되어 있지 않은 것을 볼 수있다. 내가 전에 이러한 행위를 본 적이 없다android - 서비스 클래스의 인스턴스를 만드는 의미

@Override 
    protected void onResume() { 
     super.onResume(); 
mMyService = new MyService(); 
} 


@Override 
    protected void onStart() { 
     super.onStart(); 
    mMyService = new MyService(); 
} 

: 활동이 개발자는 다음과 같은 호출 onResume에서 발생하는 어떤

이다. 메모리 누수가 발생합니까? 안드로이드 구성 요소는 매니페스트에서 선언되고 결코 인스턴스화되지 않습니까? 시스템이 귀하를 대신해 처리합니다.

서비스 자체

는 아무것도 매니페스트에 선언되지 않은, 다시이

public class MyService extends Service { 

    @Nullable 
    @Override 
    public IBinder onBind(Intent intent) { 
     return null; 
    } 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
    } 


    //... a bunch of other methods that do stuff by calling from the "new" instance would be below. 

} 

과 같이 선언한다. 이 또 다른 패턴이며 안전합니까?

답변

2

내가 더 조사하고 난 서비스가 매니페스트에 선언되지 않은 것을 볼 아직 여전히 작동합니다!

클래스는 일반 자바 클래스로 사용되므로 "작동"합니다. 호출 할 수있는 필드와 public 메소드가 있지만 더 이상 Android 서비스가 아닙니다. Android 서비스는 백그라운드에서 장기 실행 작업을 수행하기위한 구성 요소이며 수명주기가 있으며 Context을 참조합니다. 와 서비스 인스턴스를 만들 때

예를 들어 : MyService service = new MyService() 당신은 클래스의 onCreate() 메서드가 호출되지 않는다는 것을 알 수 있습니다, 당신은 같은 Toast 보여주는로 Context의 사용을 포함 무언가를 수행하려는 경우, 당신은 것입니다 예외를 얻는다.

2

메모리 누수가 발생합니까?

본질적으로 아닙니다. MyService은 다른 Java 객체보다 유출되는 경향이 없습니다.

안드로이드 구성 요소는 매니페스트에서 선언되고 결코 인스턴스화되지 않습니까?

당신이 registerReceiver()을 사용하는 경우에만 가끔 그런 다음 자신이 BroadcastReceiver이다 인스턴스화하고, 유일한 안드로이드 구성 요소입니다. 그렇지 않으면 프레임 워크 클래스가 구성 요소를 인스턴스화합니다.

이 다른 패턴 제한된 경험 "개발자"에서

하나입니다. 일반적으로 이런 종류의 것은 Context이 필요한 사람부터 시작하여 무작위로 Activity 또는 Service의 하위 클래스를 만들고 인스턴스 (예 : new MyService())를 만들고 Context을 만들 수 있다고 생각합니다. Context은이 방법으로 올바르게 초기화되지 않으므로 거의 작동하지 않습니다. 때로는 개발자 자신이 어둑한 숫자의 Stack Overflow 질문과 GPSService 주위의 회전하는 답변을 MyService과 같이 다른 곳에서 본 일부 코드 만 복사하는 경우가 있습니다.

  • 표시 한 아무것도 실시하지 않는 방법을 제거 extends Service

  • 을 제거 :이 클래스는 (활동의 일부가되는 대) 모두에 존재한다고 가정

    , 나는 당신이하는 것이 좋습니다 코드에서 onBind()onCreate() 방법

  • 가결과 어떤 빌드 오류를 수정 니펫을 같은 @Override, 등은 더 이상 Service을 확장하지 않습니다. 이러한 메서드가 실제 Context 개체 (예 :의`활동)