2013-06-17 5 views
1

시스템 기본 소리와 별개로 내 앱을 설정하기 위해 나만의 맞춤 알림 소리를 재생하고 싶습니다. 따라서 GCM 메시지를 받으면 상태 표시 줄에 알림을 넣고 소리를 재생하는 generateNotification이라는 기능이 있습니다.하드 코드 된 경로없이 앱을 닫을 때 소리 재생

String GENERAL_NOTIFICATION_SOUND = "android.resource://" + MyActivity.getInstance().getPackageName() + "/" + R.raw.sound_file; 

응용 프로그램이 열려있을 때이 작업, 응용 프로그램이 최근 닫더라도 :

현재,이 같은 소리의 경로를 설정합니다. 앱이 안드로이드의 메모리 관리에 의해 닫히면, MyActivity.getInstance()null을 반환하고 경로를 확인할 수 없기 때문에 알림을 제대로 표시하지 않으면 내 앱이 NullPointerException과 충돌합니다.

경로를 하드 코딩하여 문제를 해결할 수 있다고 생각하지만 더 나은 방법이 있어야한다고 생각합니다. 앱이 열리지 않을 때 액세스해야하는 파일 경로를 어떻게 설정할 수 있습니까?

답변

2

먼저 메모리 누수가 있으므로 MyActivity.getInstance()이 없어야합니다.

두 번째로 어떤 코드가 올라가든지 Notification은 이미 Context에 액세스 할 수 있으므로 여기에서 NotificationManager을 얻을 수 있습니다. getPackageName()Context의 메소드입니다. 따라서 예를 들어 GCM IntentServiceContext이므로 getSystemService()을 사용하여 NotificationManager을 검색 할 수있을뿐만 아니라 getPackageName()을 호출하여 앱의 패키지 이름을 확인할 수 있습니다.

+0

이것은 훌륭합니다. 명백한 점을 지적 해 주셔서 감사합니다. 바보 나. 왜 "MyActivity.getInstance()"가 메모리 누수인지 나쁜지에 대해 자세히 설명해 주시겠습니까? –

+0

@ unexpected62 : '활동'이 파괴 된 후에 (예 : 사용자가 BACK 키를 누름) 가비지 수집해야하지만, 정적 참조로 인해이를 방지 할 수 있기 때문에 메모리 누수입니다. 이것은 활동과 그것이 보유하고있는 모든 것 (위젯, 모델 데이터 등)은 가비지 수집을 할 수 없다는 것을 의미합니다. 이는 메모리 누수를 나타냅니다. – CommonsWare

+0

아, 알겠습니다. 내 구현에서는 이것이 실제로 요구된다. AndEngine을 사용하고 있는데 하나의 활동 만 있고 엔진의 구성 요소 인 "장면"을 전환하여 화면을 전환합니다. 그래서 이것은 저에게 바람직한 행동입니다. 관심과 설명에 감사드립니다. –