본문 바로가기
Android 기법/# Study

[Android]Background Tasks

by 퍼즐잎 2017. 7. 18.

PreferenceActivity에서 서버와 싱크가 필요한 동작을 수행하는 것은 좋지 않다.

사용자가 MainActivity로 돌아가는 경우 PreferenceActivity가 파괴되기 때문이다.


그래서 네트워크 트랜젝션이 필요한 작업들을 액티비티 내에서 수행하는 것은 바람직하지 못하다고 한다.


PreferenceActivity(Setting 화면을 구상할때 쓰면 좋은)

[참고 : http://itmir.tistory.com/523 ]


1. Service


Service는 백그라운드에서 오래 실행되는 작업을 수행할 수 있는 

애플리케이션 구성 요소이며 사용자 인터페이스를 제공하지 않는다.


Service는 백그라운드에서 데이터 로딩과 처리를 효율적으로 할 수 있게 해준다.

수행하려는 작업이 UI와 분리되어 있을 때 사용하는것이 적합하다.


(ex : 데이터베이스를 백그라운드에서 업데이트, DB의 데이터를 캐시하는 경우)



2. Loader


액티비티 또는 프래그먼트에서 비동기식으로 데이터를 쉽게 로드할 수 있게 해준다.


백그라운드 로딩작업이 액티비티에서만 사용된다면 Loader가 더 적합할 수 있다.

(ex : 이미지 뷰에 쓰일 이미지의 디코딩 작업, 데이터를 읽어와서 RecyclerView 어댑터를 동작, 네트워크 트랜잭션)




Service 시작하기


1. 수동으로 시작

2. 스케줄로 시작

3. 바인드된 서비스


[https://developer.android.com/guide/components/bound-services.html]


- 서비스는 서버가 되고 컴포넌트들이 클라이언트가 되는 구조

(바인드된 서비스와 컴포넌트는 계속해서 상호작용한다.)

(ex 뮤직플레이어의 음악 재생과 진행상황 업데이트)




Service 생명주기

1. startService()

2. onCreate()

3. onStartCommand() <-- 서비스가 동작하는 부분, 여기에서 AsyncTask를 만들어 사용할 수 있다.

4. stopSelf() <-- 서비스종료를 알릴 수 있다.

5. onDestroy()



IntentService

별개의 백그라운드 스레드에서 실행되는 서비스

(IntentService를 상속하는 클래스를 이용한다)


onHandleIntent 메소드에 백그라운드에서 동작해야하는 작업을 지정하며 작업이 끝나면 스스로 종료된다.

IntentService들은 요청된 순서대로 모두 하나의 백그라운드 스레드에서 수행되며 메인스레드를 블록하지 않는다.


순서대로 처리해야 되는 작업들에 유용한다.



1
2
3
4
5
6
7
8
9
10
11
12
13
public class DbService extends IntentService {
    public DbService() {
        super("DbService");
    }
    @Override
    protected void onHandleIntent(@Nullable Intent intent) {
        //@TODO 작업 내용을 구현한다.
        sendBroadcast(new Intent("broadCastReceiver"));
    }
}
 
cs


1
   <service android:name=".service.DbService"/>
cs




Notification & PendingIntent


Intent는 같은 앱의 액티비티를 실행하거나 앱 바깥의 액티비티를 실행하게 해준다.

다른 앱이나 서비스를 실행하려면 그에 맞는 권한이 Manifest에 선언 되어 있어야 한다.


다른 앱이 나의 앱을 실행하게 하려면


안드로이드의 모든 알림은 NotificationManager라는 시스템 서비스에 의해서 동작하는데

시스템 서비스는 안드로이드 시스템에 의해서 시작되는 서비스이므로

나의 앱의 일부가 아니다.


그러므로 권한이 필요하다!


PendingIntent는 일반적인 인텐트를 감싸고 있는 것으로 다른 앱에서 사용할 수 있도록 설계 되어 있다.

모든 권한을 가진 나의 앱인것 처럼 동작한다.


서비스, private 액티비티, 브로드캐스트 방지 인텐트등을 실행할 수 있고

앱이 실행중이 아닐때에도 가능하다.


알림 서비스를 만들때 유용하다.


https://developer.android.com/reference/android/app/PendingIntent.html




댓글