본문 바로가기
Front-end/Android (안드로이드 앱 개발)

Android Studio , Service & Intent Service & Forground Service

by javapp 자바앱 2020. 8. 5.
728x90

 

Service 서비스

백그라운드 처리, 쓰레드와 다른 작업할

Activity 화면을 가지고 있어 화면이 보이는 동안 동작

안드로이드 7버전은 서비스 액티비티(어플) 종료시 다시 쓰레드 동작 , 8이후는 종료

 

New -> serivce

< MyService.java > //쓰레드 추가 가능

//서비스가 가동될 때 호출되는 메서드
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    return super.onStartCommand(intent, flags, startId);
}
//서비스가 중지되면 호출되는 메서드
@Override
public void onDestroy() {
    super.onDestroy();
}

 

<메인>

serviceIntent = new Intent(this, MyService.class);
startService(serviceIntent);

//중지
stopService(serviceIntent);

 

 

Intent Service

IntentService Serivce 내부에서 Thread 운영

//별도의 쓰레드가 발생되어 처리
@Override
protected void onHandleIntent(Intent intent) {
}

 

 

Forground Service

<메인>

serviceIntent = new Intent(this, ForgroundMyService.class);

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
{
    startForegroundService(serviceIntent);
}else{
    startService(serviceIntent);
}

 

 

 

Forground Service

notification으로 알려준다.

 

1.  <uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>

 

2.   <ForgroundMyService.java>

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    //안드로이드 8 이상이면 노티피케이션 메시지를 띄우고 forground serivice로 운영
    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
        NotificationManager NoManager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
        NotificationChannel channel = new NotificationChannel("test1","Service",NotificationManager.IMPORTANCE_DEFAULT);
        channel.enableLights(true);     //채널에 게시 된 알림에 알림 표시 등을 표시
        channel.setLightColor(Color.RED);
        channel.enableVibration(true);
        NoManager.createNotificationChannel(channel);

        NotificationCompat.Builder NCBuilder = new NotificationCompat.Builder(this,"test1");
        NCBuilder.setSmallIcon(android.R.drawable.ic_menu_search);
        NCBuilder.setContentTitle("서비스 가동");
        NCBuilder.setContentText("서비스가 가동 중입니다람쥐");
        NCBuilder.setAutoCancel(true);
        Notification notification = NCBuilder.build();

        //현재 노티피케이션 메시지를 포그라운드 서비스의 메시지로 등록
        startForeground(10,notification);
    }
    //쓰레드 가동
    Runnable runnable =new Runnable(){
        @Override
        public void run(){
            SystemClock.sleep(5000);
            System.out.println("Thread");

            //완료되면 노티피케이션 메시지 사라지게
            if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
                stopForeground(STOP_FOREGROUND_REMOVE);
                NotificationManager nm = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
                nm.cancel(10);
            }
        }
    };
    Thread thread = new Thread(runnable);
    thread.start();
    return super.onStartCommand(intent, flags, startId);
}

 

Notification

 

 

IPC

Activity에서 실행 중인 서비스의 데이터를 사용

(test 실패.)

댓글