28

그래서 나는 간단한 음악 플레이어에서 일하고 있습니다. 음악 플레이어는 상태를 이름으로 지정하고 노래를 재생할 수 있으며 재생을 일시 중지하고 다음 노래로 전달하고 이전 노래로 돌아가고 완전히 재생을 중지 할 수 있습니다. 노래를 재생하면 아티스트 이름 및 노래 이름으로 알림이 표시됩니다. 이 알림에는 세 가지 버튼 (작업)이 있습니다. 중지, 다음 일시 중지.활동을 시작하지 않고 알림에서 작업을 사용하는 방법

내가 겪고있는 문제는 두 동작 중 하나를 클릭 할 때 동작과 관련된 재생 컨트롤이 실행되고 음, 그 방법을 전혀 모른다는 것입니다. Android 알림 : http://developer.android.com/guide/topics/ui/notifiers/notifications.html을 검색했지만 알림 동작에 너무 많은 정보를 제공하지 않습니다. 주 : 다음 패키지하에 작성된 후술 모든 코드 : com.deadpixels.light 여기

알림에 "다음"버튼 클릭과 연관되어야 예컨대 간단한 동작 (인 .player과 활동이라고 : PlayerActivity 여기

public void nextSong() { 
    if (position == songs.size() -1) { 
     Toast.makeText(this, "No more songs on queue", Toast.LENGTH_SHORT).show(); 
     if(mPlayer.isPlaying()) { 
      return; 
     } 
     else { 
      buttonPlay.setImageResource(R.drawable.button_play); 
     } 
     return; 
    } 
    else { 
     position++; 
     playSong(songs.get(position)); 
    } 
} 

내가 어떻게 뭘하려 :

Intent nextIntent = new Intent(KEY_NEXT); 
PendingIntent nextPendingIntent = createPendingResult(0, nextIntent, 0); 
public static final String KEY_NEXT = "com.deadpixels.light.player.PlayerActivity.nextSong"; 

후 나는 addAction()를 통해 알림에 있음을 추가 :은 NextIntent에 대한 조치는 어디

mBuilder.addAction(R.drawable.not_action_next, "Next", nextPendingIntent); 

너희들이 내가 시도 할 수 밖에 무엇을 알고 있습니까? 위에서 설명한 내용을 전혀 사용하지 않으면 알림이 표시되고 3 개의 동작 버튼이 있지만 나를 클릭해도 아무 것도 할 수 없습니다.

한순간에 나는 액션 이름을 가진 인 텐트 필터를 추가했다면 생각했지만 글쎄, 그들은 모두 같은 네임 스페이스에있다.

답변

43

브로드 캐스트를 사용하여이 문제를 해결했습니다.

IntentFilter filter = new IntentFilter(); 
filter.addAction(KEY_NEXT); 
// Add other actions as needed 

receiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     if (intent.getAction().equals(KEY_NEXT)) { 
      nextSong(); 
     } else if (...) { 
      ... 
     } 
     ... 
    } 
} 

registerReceiver(receiver, filter); 

당신이 서비스를 사용하는 경우 : 당신이 Activity 것은 내 BroadcastReceiver을 등록 그런

Intent nextIntent = new Intent(KEY_NEXT); 
PendingIntent nextPendingIntent = PendingIntent.getBroadcast(this, 0, nextIntent, 0); 

예를 들어, 다음 노래로 진행 브로드 캐스트를 전송하려면 다음을 사용할 수 있습니다 백그라운드 재생을 관리하려면 활동 대신 서비스에 BroadcastReceiver을 등록해야합니다. 활동 또는 서비스가 종료 될 때 등록을 취소 할 수 있도록 receiver 인스턴스를 어딘가에 저장하십시오.

+1

수신자 인스턴스를 저장해야합니다. –

+0

@anonymous 귀하의 활동이나 서비스에 대한 참조를 유지하십시오. – acj

+1

왜 BroadcastReceiver를 매니페스트에 등록하고 별도의 클래스로 만드시겠습니까? – streamride

관련 문제