์ด ์์ ์์ ์ฌ์ฉ ๋ ์ฐ๊ฒฐ ์ ์ง ๋ฐฉ๋ฒ์ ์๋์ ๋ธ๋ก๊ทธ ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ๋ถ๋ถ์ ์ผ๋ก ํ์๋ฉ๋๋ค. D-clock์ Android DaemonService๋ก๋ถํฐ ์๋ฆผ์ ํ์ํ์ง ์๊ณ ํฌ์ด ๊ทธ๋ผ์ด๋ ์๋น์ค๋ฅผ ์์ํ๊ณ ๋ค๋ฅธ ๋น ๊ธฐ๋ณธ ๋ ์ด์ด Keepalive ๋ฉ์๋๋ฅผ ๊ตฌํํฉ๋๋ค.
D-clock / AndroidDaemonService
##์์ 2 ๊ฐ์ ๋งํฌ ๋๋ถ๋ถ์ด ๋ณด๊ด๋ฉ๋๋ค :
D-clock :
์์ด๋์ด 1 : API <18, ์ ๊ฒฝ ์๋น์ค ์์์ ์ง์ ์์ ๋๋ new Notification()๏ผ
์์ด๋์ด 2 : API >= 18, ๊ทธ๋ฆฌ๊ณ ๊ฐ์ id๋ฅผ ๊ฐ์ง ๋ ๊ฐ์ ์ ๊ฒฝ ์๋น์ค๋ฅผ ๋์์ ์์ํ ๋ค์, ๋์ค์ ์์๋ ์๋น์ค๋ฅผ ๋ฉ์ถ์ญ์์ค.
//์๋ฆผ์ ํ์ํ์ง ์๊ณ ํ๋ก ํธ ๋ฐ์คํฌ ์๋น์ค๋ฅผ ์์ํ ์ทจ์ฝ์ ์ API ๋ ๋ฒจ 25์์ ์์ ๋์์ผ๋ฉฐ ๋ชจ๋๊ฐ ๋ง์กฑํฉ๋๋ค!
ํ๋ก ํธ ๋ฐ์คํฌ ์๋น์ค๊ฐ ๋ฐฑ๊ทธ๋ผ์ด๋ ์๋น์ค๋ณด๋ค ์ฐ์ ์์์ ํฅ์ ์ธ์๋ ๋ค์๊ณผ ๊ฐ์ ์ฅ์ ์ด ์์ต๋๋ค.
์ต๊ทผ ์์ ๋ชฉ๋ก์์ ์นด๋๊ฐ ์ด๊ณผ๋๋ฉด ํ๋ก ํธ ๋ฐ์คํฌ ์๋น์ค๊ฐ ์ค๋จ๋์ง ์์ต๋๋ค.
(์ ๋ฐ์ดํธ : ํ ์คํธ ํ AOSP / CM / International์ด Framework ๊ณ์ธต์ ์ฌ์ํ๊ฒ ๋ณ๊ฒฝ ํ ๊ฒ์ Android ์์คํ ์์๋ง ๋ฐ๊ฒฌ๋์์ต๋๋ค.๏ผ EMUI / MIUI๊ฐ ํ์ดํธ๋ฆฌ์คํธ์ ์ถ๊ฐ๋์ง ์์ผ๋ฉด ์นด๋๊ฐ ํก๋ น๋๊ณ ํ๋ก ํธ ๋ฐ์คํฌ ์๋น์ค๊ฐ ์ค๋จ๋ฉ๋๋ค. ํ์ดํธ๋ฆฌ์คํธ๋ฅผ ์ถ๊ฐ ํ ํ์ ํฌ๋ก์ค ์นด๋์ ๋์์ ๊ตญ์ ์ ์กฐ์ ์ฒด์ ์์คํ ๊ณผ ์ ์ฌํฉ๋๋ค.)
๋ฐฑ๊ทธ๋ผ์ด๋ ์๋น์ค๊ฐ ์ค์ง๋๊ณ ๋์ค์ ๋ค์ ์์๋ฉ๋๋ค (onStartCommand๋ START_STICKY๋ฅผ ๋ฐํํฉ๋๋ค).
์ ๊ฒฝ ์๋น์ค์ ๋ฐฐ๊ฒฝ ์๋น์ค๊ฐ ๊ต์ฐจ๋๋ฉด ์ฝ๋ฐฑ์ onTaskRemoved ๋ฉ์๋์ ์์ต๋๋ค.
onDestroy ๋ฉ์๋๋ ์ค์ -> ๊ฐ๋ฐ์ ์ต์ -> ์คํ์ค์ธ ์๋น์ค์์ ์๋น์ค๊ฐ ์ค์ง ๋ ๊ฒฝ์ฐ์๋ง ๋ค์ ํธ์ถ๋ฉ๋๋ค.
3. ์๋น์ค์ onDestroy / onTaskRemoved ๋ฉ์๋๋ฅผ ๋ฎ์ด ์ฐ๊ณ ๋ฐ์ดํฐ๋ฅผ ๋์คํฌ์ ์ ์ฅ ํ ๋ค์ ์๋น์ค๋ฅผ ๋ค์ ์์ํ์ญ์์ค.
CONNECTIVITY_CHANGE, USER_PRESENT, ACTION_POWER_CONNECTED, ACTION_POWER_DISCONNECTED, BOOT_COMPLETED, PACKAGE_ADDED, PACKAGE_REMOVED.
๋คํธ์ํฌ ์ฐ๊ฒฐ์ด ๋ณ๊ฒฝ๋๋ฉด ์ํํธ์จ์ด ํจํค์ง๋ฅผ ์ค์น / ์ ๊ฑฐ ํ ๋ ์ฌ์ฉ์ ํ๋ฉด์ ์ ๊ธ์ด ํด์ ๋๊ณ ์ ์์ด ์ฐ๊ฒฐ / ์ฐ๊ฒฐ ํด์ ๋๊ณ ์์คํ ์๋์ด ์๋ฃ๋๊ณ ์๋น์ค๊ฐ ๋์ด ์ฌ๋ ค์ง๋๋ค.
์ด ์๋น์ค๋ ๋ด๋ถ์ ์ผ๋ก Service๊ฐ ์ด๋ฏธ ์คํ ์ค์ด๋ฉด ๋ค์ ์์๋์ง ์๋๋ค๊ณ ๊ฒฐ์ ํฉ๋๋ค.
5. ๋ฐ๋ชฌ ์๋น์ค๋ฅผ ์ผ์ญ์์ค : ์๋น์ค๊ฐ ์คํ ์ค์ธ์ง ํ์ธํ์ญ์์ค. ์คํ ์ค์ด ์๋๋ฉด ์คํํ์ญ์์ค.
6. ๋ฐ๋ชฌ์ ๊ตฌ์ฑ ์์์ ํ์ฑํ ๋ ์ํ๋ฅผ ๊ฐ์ํ์ฌ MAT์ ๊ฐ์ ๋๊ตฌ์ ์ํด ๋นํ์ฑํ๋์ง ์๋๋กํฉ๋๋ค
์์ธํ ๋ด์ฉ์ ์์ 2 ๊ฐ์ ๋งํฌ๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
+ ๋ฐ๋ชฌ ์๋น์ค : Android 5.0 ์ด์์ JobScheduler๋ฅผ ์ฌ์ฉํ๋ฉฐ AlarmManager๋ณด๋ค ์ฐ์ํฉ๋๋ค.
JobScheduler๋ฅผ ์ฌ์ฉํ๋ฉด ์๋๋ก์ด๋ ์์คํ ์ด ์๋์ผ๋ก Force Stop ํจํค์ง๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ง๋ง AlarmManager๋ ํ์ ์ ํ ์ ์์ต๋๋ค.
Android 4.4 ์ดํ๋ AlarmManager๋ฅผ ์ฌ์ฉํฉ๋๋ค.
+ ์ฌ์ฉ ์๊ฐ Observable : Android ์ฌ์ฉ์ ์ ์ ์์คํ ์ฌ์ฉ ์ ํจ JobScheduler / AlarmManager ๊นจ์ฐ๊ธฐ ๊ฐ๊ฒฉ์ด ์์ ์ ์ด์ง ์์
+์๋น์ค๋ฅผ ์ค์งํ๊ณ ์๊ฐ ์ด๊ณผ ๋ ์จ์ดํฌ ์ ์ ์ทจ์ํ๋ ๋น ๋ฅธ ๋ฐฉ๋ฒ์ ์ถ๊ฐํ์ญ์์ค.
+ ์๋น์ค๊ฐ ํ์ํ์ง ์์ ๋ Job / Alarm / Subscription ์ ์ทจ์ํ๋ ๋ฐ๋ก ๊ฐ๊ธฐ ์ถ๊ฐ (๋ธ๋ก๋ ์บ์คํธ ์์ )
+ ๊ตญ๋ด ๋ชจ๋ธ์ ์ ์๋ ฅ ํฅ์ : Huawei ๋ชจ๋ธ์ด ๋์ ์ค๋ ํค๋ฅผ ๋ฐํ ํ๋ฉด์ผ๋ก ๋๋๋ ค ๋๊ณ ํ๋ก์ธ์ค๊ฐ ์ข ๋ฃ ๋ ํ ๋ช ์ด ๋์ ํ๋ฉด์ ์ ๊ทธ์ง ์๋๋กํฉ๋๋ค.
ํ ์คํธ ๋ชจ๋ธ : Huawei Glory 6 Plus (EMUI 4.0 Android 6.0)์์๋ ์์ฉ ํ๋ก๊ทธ๋จ์ด ํ์ฉ ๋ชฉ๋ก์ ์ถ๊ฐ๋์ง ์์ต๋๋ค.
๊ด์ฐฐ ๋ :
ํ์ฉ ๋ชฉ๋ก์ด ์์ผ๋ฉด ๋ค๋ก ๋จ์ถ๋ฅผ ๋๋ฌ ๋ฐํ ํ๋ฉด์ผ๋ก ๋์๊ฐ ๋ค์ ํ๋ฉด์ ์ ๊ทธ๋ฉด ๋ช ์ด ํ์ ํ๋ก์ธ์ค๊ฐ ์ข ๋ฃ๋ฉ๋๋ค.๏ผ
๊ทธ๋ฌ๋ ๋ฐํ ํ๋ฉด์ผ๋ก ๋์๊ฐ๋ ค๋ฉด ํ ๋จ์ถ๋ฅผ ๋๋ฌ๋ ํ๋ฉด์ด ์ ๊ฒจ ์์ด๋ ํ๋ก์ธ์ค๊ฐ ์ข ๋ฃ๋์ง ์์ต๋๋ค.
( ์ ๋ฐ์ดํธ : ํ ์คํธ ํ, EMUI ์์คํ ์์ ํ๋ฉด์ด ์ ๊ฒจ ์์ด๋ ํ๋ก์ธ์ค๊ฐ ์ข ๋ฃ๋์ง๋ ์์ต๋๋ค. ์์ฉ ํ๋ก๊ทธ๋จ ์ฉ ์นด๋ ๋ง ๋ฉํฐ ํ์คํน ํ๋ฉด์ ์ฒซ ๋ฒ์งธ ํ๋ฉด์์ ์ ํจํฉ๋๋ค. ๋ ๋ฒ์งธ ํ์ด์ง ์ด์์ผ๋ก ํธ์๋๋ฉด ์ ๊ฒจ์ง๋๋ค. ํ๋ฉด์ด ํ๋ก์ธ์ค๋ฅผ ์ฃฝ์ผ ๋ช ์ด ํ, ํ์ดํธ๋ฆฌ์คํธ์ ๊ฐ์ ํ ํ ๋ฐํ ํ๋ฉด์ผ๋ก ๋์์จ ๋ค์ ํ๋ฉด์ ์ ๊ทธ๋ฉด ํ๋ก์ธ์ค๊ฐ ์ข ๋ฃ๋์ง ์์ต๋๋ค)
๋ฐ๋ผ์ onBackPressed ๋ฉ์๋๋ ํ์ฌ Activity finish / destroy ๋์ ๋ฐํ ํ๋ฉด์ผ๋ก ๋ง ๋ฐํ๋๋๋ก ๋ค์ ์์ฑ๋ฉ๋๋ค.
ํ ์คํธ ๋ชจ๋ธ : Redmi 1S 4G (MIUI 8 Android 4.4.2)๋ ์์ฉ ํ๋ก๊ทธ๋จ์ด ํ์ฉ ๋ชฉ๋ก์ ์ถ๊ฐ๋์ง ์์ต๋๋ค.
๊ด์ฐฐ ๋ ::
ํ์ดํธ๋ฆฌ์คํธ๊ฐ ์์ผ๋ฉด ๋ฐํ ํ๋ฉด์ผ๋ก ๋์๊ฐ์ ํ๋ฉด์ ์ ๊ทธ๋ฉด ํ๋ก์ธ์ค๊ฐ ์ข ๋ฃ๋์ง ์์ต๋๋ค.
๊ทธ๋ฌ๋ ์นด๋๊ฐ ์๋ฆฐ ๊ฒฝ์ฐ ํ๋ก์ธ์ค๊ฐ ์ข ๋ฃ๋์ด ๋ ์ด์ ์์๋์ง ์์ผ๋ฉฐ ํ์ฉ ๋ชฉ๋ก์ ์ถ๊ฐํ๋ฉด ์นด๋๊ฐ ์ ๊ฑฐ๋๊ณ ์๋น์ค๊ฐ ์ค์ง๋์ง ์์ต๋๋ค. ์ด๊ฒ์ CM์ ๋์๊ณผ ์ ์ฌํฉ๋๋ค.
๋ค์ดํฐ๋ธ ํต ์ผ๋ผ์ด๋ธ๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ ค๋ ๊ฒฝ์ฐ ์ฌ์ฉ์๋ฅผ ํ์ฉ ๋ชฉ๋ก์ผ๋ก ์ ๋ํ๋ ๊ฒ์ด ๋ ์ ํฉํ ๋ฐฉ๋ฒ ์ผ ์ ์์ต๋๋ค
- Android Doze ํจํด
- ํ์จ์ด ์์ฒด ๊ด๋ฆฌ
- ํ์จ์ด ์ ๊ธ ํ๋ฉด ์ ๋ฆฌ
- ๋ฐ๋ ์ ํ ์คํํธ ๊ด๋ฆฌ
- ๊ธฐ์ฅ ์จ๊ฒจ์ง ๋ชจ๋
- ์ผ์ฑ 5.0 / 5.1 ์์ฒด ์คํ ์์ฉ ํ๋ก๊ทธ๋จ ๊ด๋ฆฌ
- Samsung 6.0+ ๊ฐ๋ ๋์ง ์์ ์์ฉ ํ๋ก๊ทธ๋จ ๊ด๋ฆฌ Meizu ์๊ธฐ ๊ด๋ฆฌ ์์ Meizu ๋๊ธฐ ์ ์ ๊ด๋ฆฌ
- Oppo ์์ฒด ์์ ๊ด๋ฆฌ
- Vivo์ ๋ฐฐ๊ฒฝ์์ ๋์ ์ ๋ ฅ ์๋น
- Kai์ Jin Li ์์ฉ ํ๋ก๊ทธ๋จ
- ์ง๋ฆฌ ๊ทธ๋ฆฐ ๋ฌด๋ ๋ค
- LeTV ์ ํ ์คํํธ ๊ด๋ฆฌ
- LeTV ์ ํ๋ฆฌ์ผ์ด์ ๋ณดํธ
- ์ฟจ ์คํํธ ๊ด๋ฆฌ
- Lenovo ๋ฐฑ๊ทธ๋ผ์ด๋ ๊ด๋ฆฌ
- Lenovo ๋ฐฑ๊ทธ๋ผ์ด๋ ์ ๋ ฅ ์ต์ ํ
- ZTE ์๋ํ ๊ด๋ฆฌ
- ZTE ์ ๊ธ ํ๋ฉด์ผ๋ก ๋ณดํธ ๋ ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ์ํ
android.support.v7.AlertDialog๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์๊ฐ ์ฑ์ ํ์ฉ ๋ชฉ๋ก์ ์ถ๊ฐํ๋๋ก ์๋ดํฉ๋๋ค.
+ ๋ฐ๋ชฌ ์๋น์ค์ BroadcastReceiver๋ : watch ์๋ธ ํ๋ก์ธ์ค์์ ์คํ๋๊ณ , ๋ฉ์ธ ํ๋ก์ธ์ค์ ๊ตฌ๋ถ๋๋ค.
+ AIDL ๋๋ ๋ค๋ฅธ IPC ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์ฌ ์๋น์ค์ ํต์ ํ ํ์๊ฐ ์๋๋ก ์์ ํ๋ก์ธ์ค๊ฐ ์ฃผ ํ๋ก์ธ์ค์์ ์คํ๋ฉ๋๋ค.
Poweramp๋ฅผ ์ฐธ์กฐํ๋ฉด, ์์๋ ํฌ ๊ทธ๋ผ์ด๋ ์๋น์ค๋ UI์ ๋์ผํ ํ๋ก์ธ์ค์์ ์คํ๋ฉ๋๋ค.
+ ๋ฐ๋ณต๋๋ ์์ ์๋น์ค๋ฅผ ๋ฐฉ์งํ๊ธฐ์ํ ํ๋ก์ธ์ค๋ฅผ ์ํํ๊ณ , ์์๋ก startService(Intent i)
์๋น์ค๊ฐ ์์ง ์คํ ์ค์ด๋ฉด ์๋ฌด ์์ ๋ํ์ง ๋ง๊ณ ์๋น์ค๊ฐ ์คํ ์ค์ด ์๋๋ฉด ์๋กใ
+ ํ์ ์ค๋ ๋์์ ์์ฝ ๋ ์์ ์คํ, ์ฌ์ ์คํ ๊ฒ์ฌ ๋ฐ ํ๊ดด ์ค์ ์ ์ฅ๋ ๋ฌธ์ ์ฒ๋ฆฌ
์์ ์ ์์ํ๊ธฐ ์ ์ ๋จผ์ ๋์คํฌ๊ฐ ๋ง์ง๋ง์ผ๋ก ์ญ์ ๋๋ ๋์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ ํ์ธํ๊ณ ์ฃผ๊ธฐ์ ์ผ๋ก ๋์คํฌ์ ์ ์ฅํ์ญ์์ค
build.gradle ์ถ๊ฐ
compile 'com.xdandroid:hellodaemon:+'
/**
* ์์
์ด ์๋ฃ๋๋ฉด ์๋น์ค ์์
์ด ํ์ํ์ง ์์ต๋๊น?
* @return ์๋น์ค๋ฅผ ์ค์งํด์ผํฉ๋๋ค., true; ์๋น์ค๋ฅผ ์์ํด์ผํฉ๋๋ค., false; ํ๋จ ํ ์ ์๋ค, null.
*/
Boolean shouldStopService();
/**
* ์์
์ด ์คํ ์ค์
๋๊น?
* @return ์์
์ด ์คํ ์ค์
๋๋ค., true; ์์
์ด ํ์ฌ ์คํ๋๊ณ ์์ง ์์ต๋๋ค., false; ํ๋จ ํ ์ ์๋ค., null.
*/
Boolean isWorkRunning();
void startWork();
void stopWork();
//Service.onBind(Intent intent)
@Nullable IBinder onBind(Intent intent, Void unused);
//์๋น์ค๊ฐ ์ข
๋ฃ๋๋ฉด ํธ์ถ๋์ด ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ์ ์์ต๋๋ค.
void onServiceKilled();
Manifest์ ์๋น์ค๋ฅผ ๋ฑ๋กํ๋ ๊ฒ์ ์์ง ๋ง์ญ์์ค.
์์ฉ ํ๋ก๊ทธ๋จ์ onCreate ()์์ ํธ์ถ ๋จ
DaemonEnv.initialize(
Context app, //Application Context.
Class<? extends AbsWorkService> serviceClass, //๋ฐฉ๊ธ ์์ฑํ ์๋น์ค์ Class ์ค๋ธ์ ํธ
@Nullable Integer wakeUpInterval); //ํ์ด๋ฐ ์จ์ดํฌ ์
๊ฐ๊ฒฉ (ms), ๊ธฐ๋ณธ๊ฐ์ 6 ๋ถ์
๋๋ค.
Context.startService(new Intent(Context app, Class<? extends AbsWorkService> serviceClass));
Manifest์์ android : name์ ํตํด ์ด ์ฌ์ฉ์ ์ ์ ์์ฉ ํ๋ก๊ทธ๋จ์ ์ฌ์ฉํ๋ ๊ฒ์ ์์ง ๋ง์ญ์์ค.
Context.startService(new Intent(Context c, Class<? extends AbsWorkService> serviceClass))
AbsWorkService๋ฅผ ํ์ฅํ๋ ค๋ฉดstopService ()๋ฉ์๋๋ฅผ ์ถ๊ฐํ์ญ์์ค :
1.shouldStopService ()๊ฐtrue๋ฅผ ๋ฆฌํดํ๋๋ก ์ ์งํ๋ ํ๋๊ทธ๋ฅผ ์กฐ์ํ์ญ์์ค;
-
ํ์ฌ SDK์์ ์ ๊ณตํ๋ API ๋ API๋ฅผ ํธ์ถํ์ฌ ์์ ์ ์ค์งํ์ญ์์ค.
-
AbsWorkService.cancelJobAlarmSub ()์ ํธ์ถํ์ฌ Job / Alarm / Subscription์ ์ทจ์ํ์ญ์์ค.
์๋น์ค๋ฅผ ์ค์งํ๋ ค๋ฉด extends AbsWorkService์์stopService ()๋ฅผ ํธ์ถํ์ญ์์ค.
๋ค์ API๋ ๋ชจ๋ IntentWrapper์ ์์ต๋๋ค. :
List<IntentWrapper> getIntentWrapperList();
//์ฌ์ฉ์๊ฐ ์ฑ์ ํ์ฉ ๋ชฉ๋ก์ ์ถ๊ฐํ๋๋ก ์๋ดํ๋ android.support.v7.AlertDialog ํ์
.
void whiteListMatters(Activity a, String reason);
//Huawei ๋ชจ๋ธ์ด ํ์ดํธ๋ฆฌ์คํธ์ ํฉ๋ฅํ์ง ๋ชปํ๋๋กํ๋ ค๋ฉด ๋ค๋ก ๋ฒํผ์ ๋๋ฌ ๋ฐํ ํ๋ฉด์ผ๋ก ๋์๊ฐ์ ํ๋ก์ธ์ค๊ฐ ์ข
๋ฃ ๋ ํ ๋ช ์ด ๋์ ํ๋ฉด์ ์ ๊ธ๋๋ค.
//MainActivity.onBackPressed ()๋ฅผ ์ฌ์ ์ํ์ฌ ๋ค์ API์ ๋ํ ํธ์ถ ๋ง ๋จ๊น๋๋ค.
void onBackPressed(Activity a);
์๋น์ค๊ฐ ๋ ์ด์ ํ์ ์์ผ๋ฉด ์ฌ์ฉ์์ ์ ์์ ์ ์ฅํ๊ธฐ ์ํดAbsWorkService.cancelJobAlarmSub ()```์ ํธ์ถํ์ฌ ์ค์ผ์ค ๋ ์จ์ดํฌ ์
Job / Alarm / Subscription,์ ์ทจ์ํ๊ณ stopService () ''๋ฅผ ํธ์ถํ์ฌ ์๋น์ค๋ฅผ ์ค์ง ํ ์ ์์ต๋๋ค.
์์ธํ ๋ด์ฉ์ ์ฝ๋ ๋ฐ ๋ฉ๋ชจ๋ฅผ ์ฐธ์กฐํ์ญ์์ค.