이것저것 다 개발

[Android] 부팅 시 실행되는 Service App 만들기 본문

Android

[Android] 부팅 시 실행되는 Service App 만들기

용용개발 2018. 4. 5. 19:07

부팅 시 자동으로 실행되는 Service를 만들어 보겠습니다.


Service는 백그라운드에서 실행되는 작업을 수행할 수 있는 애플리케이션의 구성 요소이며

사용자 인터페이스를 제공하지 않습니다. 


순서는 다음과 같습니다.

1. Manifest 권한 등록

2. Receiver 만들기, Manifest Receiver 등록

3. Service 만들기, Manifest Service 등록


먼저 부팅이 완료되었다는 것을 알 수 있도록 AndroidManifest.xml에서 권한을 등록해줍니다.

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

그리고 Activity에 부팅이 완료됨을 받을 수 있는 Receiver를 만들어 줍니다.

Receiver는 BroadcastReceiver를 확장하면 됩니다.

companion object {
class BootReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
if("android.intent.action.BOOT_COMPLETED".equals(intent.action)) {
var serviceIntent = Intent(context, MainService:: class.java)
context.startService(serviceIntent)
Log.d("BootReceiver", "Service loaded at start..")
}
}
}
}

여기서 companion object는 java에서 static의 개념입니다.

companion object의 내부의 class로 하지 않을 경우 아래와 같은 에러가 발생합니다.

E/AndroidRuntime: FATAL EXCEPTION: main

                                                 Process: kr.co.yongyi.test.bootservice, PID: 3178

                                                 java.lang.RuntimeException: Unable to instantiate receiver kr.co.yongyi.test.bootservice.activity.MainActivity$Companion$BootReceiver: java.lang.ClassNotFoundException: Didn't find class "kr.co.yongyi.test.bootservice.activity.MainActivity$Companion$BootReceiver" on path: DexPathList[[zip file "/data/app/kr.co.yongyi.test.bootservice-1/base.apk"],nativeLibraryDirectories=[/data/app/kr.co.yongyi.test.bootservice-1/lib/x86, /system/lib, /vendor/lib]]


Receiver를 만들었다면 AndroidManifest.xml에 명시해줍니다.

 <receiver

     android:name=".activity.MainActivity$Companion$BootReceiver"

android:enabled="true"
android:exported="false"
android:label="BootReceiver"
android:permission="android.permission.RECEIVE_BOOT_COMPLETED">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>

enabled="true" 는 BootReceiver를 실행하겠다는 속성이고

exported="false"는 다른 앱에서 사용 불가능 속성입니다.


Activity에 Receiver를 만들어주었다면 다음으로 Service를 간단하게 만들겠습니다.

Service를 확장하는 MainService에 Runable을 확장하는 serviceThread를 만들겠습니다. 

/**
* Created by yongyi on 2018-03-27.
*/
class MainService : Service() {

private val TAG = "MainService"

override fun onBind(intent: Intent?): IBinder {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}

override fun onCreate() {
super.onCreate()
Log.d(TAG, "onCreate()")

var serviceThread = Thread(ServiceStart())
serviceThread.start()

}

inner class ServiceStart : Runnable {
override fun run() {
// do something..

Log.d(TAG. "service running...")
}
}

}

Service 까지 만들었다면 다시 AndroidManifest.xml에 서비스를 명시해줍니다.

<service android:name="kr.co.yongyi.test.bootservice.service.MainService"/>

앱을 Run 한 후 휴대폰을 껐다키게 되면 Service가 실행됩니다.


이상입니다.


## 위 코드는 코틀린으로 코딩된 소스입니다 ##

Comments