Service - 백그라운드 음악 실행 토요특강 / 안드로이드

2010/11/20 11:31

복사 http://blog.naver.com/jeggange/90100530068

Service

 

사용자와 상호작용 없이 내부적으로 실행되는 프로세스

- UI없이 오랫동안 살아있으면서 실행되는 코드들

- media player activity는 Context.startService()를 이용하여 백그라운드로 음악이 계속 재생되는 서비스 구동

- 서비스에 접근할 때, 서비스에 의해 나타난 인터페이스를 통해 서비스와 통신할 수 있다.

 

 

 

 

 

 

 

 

이미지 버튼과 음악 재생에 사용할 파일을 미리 준비해 둔다

미디어 파일은 /res/raw 폴더 생성

 

 

xml 버튼에 onClick 이벤트 달기

 


 android:id="@+id/btnStop" 
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="10dp"
    android:onClick="btnProcess" />

 

 

 

 

 

main.xml

 


http://schemas.android.com/apk/res/android"

    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >

    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="음악  즐기기" />

 android:id="@+id/btnStart" 
    android:layout_width="fill_parent"
    android:layout_height="wrap_content" 
    android:src="@drawable/pic"
    android:layout_marginTop="20dp"
    android:onClick="btnProcess" />

 android:id="@+id/btnStop" 
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="서비스 중지"
    android:layout_marginTop="10dp"
    android:onClick="btnProcess" />

 android:id="@+id/btnExit" 
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="어플 종료"
    android:layout_marginTop="10dp"
    android:onClick="btnProcess" />                   

 

 

 

 

 

Manifest.xml

 

       
       


        
 

MainApp.java

 

package aa.serviceEx;

import android.app.*;
import android.content.*;
import android.os.*;
import android.view.*;
import android.widget.*;

public class MainApp extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
    public void btnProcess(View v) {
      Toast.makeText(this, "success", 2000).show();
      }
}

 

 

 

 

 

 

버튼 테스트를 위해 토스트를 달았다.

세가지 버튼을 누르게 되면 모두 같은 프로세스를 호출하기 때문에

같은 success 메시지가 나온다.

 

 

 

 

음악 재생 코드 추가

MainApp.java

 

package aa.serviceEx;

import android.app.*;
import android.content.*;
import android.os.*;
import android.view.*;
import android.view.View.*;
import android.widget.*;

public class MainApp extends Activity implements OnClickListener {
    /** Called when the activity is first created. */
 ImageButton btnStart;
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
        btnStart = (ImageButton)findViewById(R.id.btnStart);
        Button btnStop = (Button)findViewById(R.id.btnStop);
        Button btnExit = (Button)findViewById(R.id.btnExit);
        btnStart.setOnClickListener(this);
        btnStop.setOnClickListener(this);
        btnExit.setOnClickListener(this);
    }
   
    @Override
    public void onClick(View v) {
     if(v.getId() == R.id.btnStart) {
      startService(new Intent("aa.bb.cc.mbc"));
      btnStart.setEnabled(false);
      
     }
     else if(v.getId() == R.id.btnStop) {
      stopService(new Intent("aa.bb.cc.mbc"));
      btnStart.setEnabled(true);
      
     }
     else if(v.getId() == R.id.btnExit) {
      stopService(new Intent("aa.bb.cc.mbc"));
      btnStart.setEnabled(true);
      finish();
      
     }
    }
}

 



음악이 재생중인 상태이며,

백그라운드로 돌렸기 때문에 멀티태스킹이 가능하다.

 

 

 

 

알림 표시바 사용하기

- 시간이 나온 제일 윗 부분 드래그 해서 나오는 부분 Notification

 

MainApp.java에서 onclick 메소드 수정

 

    @Override
    public void onClick(View v) {
     // 알림 표시바 사용
     NotificationManager nm =
      (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
     
     if(v.getId() == R.id.btnStart) {
      startService(new Intent("aa.bb.cc.mbc"));
      btnStart.setEnabled(false);
      
      // Notification 처리
      Notification notification =
       new Notification(R.drawable.noti, "최신음악", System.currentTimeMillis());
      Intent intent = new Intent(this, MainApp.class);
      PendingIntent pendingIntent = PendingIntent.getService(this, 0, intent, 0);
      notification.setLatestEventInfo(this, "노래 서비스", "점심은 맛있게", pendingIntent);
      nm.notify(0, notification); // 상태표시바에 등장
     }else if(v.getId() == R.id.btnStop) {
      stopService(new Intent("aa.bb.cc.mbc"));
      btnStart.setEnabled(true);
      nm.cancel(0); // 상태 표시바에서 해제      
     }else if(v.getId() == R.id.btnExit) {
      stopService(new Intent("aa.bb.cc.mbc"));
      btnStart.setEnabled(true);
      nm.cancel(0); 
      finish();      
     }

 



 

 

 

 

MpPlayer.java

 

package aa.serviceEx;

import android.app.*;
import android.content.*;
import android.media.*;
import android.os.*;

public class MpPlayer extends Service {
 MediaPlayer mp;
 
 @Override
 public IBinder onBind(Intent intent) {
  return null;
 }
 
 @Override
 public void onStart(Intent intent, int startId) {
  super.onStart(intent, startId);
  mp = MediaPlayer.create(this, R.raw.man);
  mp.start();
 }
 
 @Override
 public void onDestroy() {
  super.onDestroy();
  mp.stop();  
  mp.release(); // 자원 반납
 }

} 


+ Recent posts