일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- react
- 안드로이드
- RecyclerView
- vim
- .kt
- props
- android
- permission
- layout
- Retrofit2
- RelativeLayout
- intent
- ReactDOM
- block scope
- LinearLayout
- cardview
- function scope
- http
- Eclipse
- Anko SQLite
- linux
- component
- javascript
- view
- Kotlin
- ConstraintLayout
- Git
- java
- ViewGroup
- Anro Coroutines
- Today
- Total
이것저것 다 개발
[Android] 부팅 시 실행되는 Service App 만들기 본문
부팅 시 자동으로 실행되는 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가 실행됩니다.
이상입니다.
## 위 코드는 코틀린으로 코딩된 소스입니다 ##
'Android' 카테고리의 다른 글
[Android] MVC Pattern (0) | 2018.04.26 |
---|---|
[Android] Kotlin Anko 간단하게 사용해보기 (0) | 2018.04.06 |
[Android] System Permission (0) | 2018.04.05 |
[Android] Bluetooth Permission 설정 및 활성화 (2) | 2018.04.04 |
[Android] AVD Custom Skin 사용하기(Custom Device) (0) | 2018.02.22 |