์๋ ํ์ธ์. ์ํผ๊ณค์ ๋๋ค.
์ด์ ๊ธ "STEEM/SCT ๋ณดํ ํ์(VP) ์๋๋ก์ด๋ ์์ ฏ #1"์์ ์๋๋ก์ด๋์ฉ STEEM&SCOT ๋ณดํ ํ์ ์์ ฏ์ฑ์ ์๊ฐ๋ฅผ ํ์์ต๋๋ค. ๋ฐ๋์ ๋ง์ ๊ธํ๊ฒ ๊ฐ๋ฐํ๊ฑฐ๋ผ ์ฑ๋์์ธ ํ๋ฆฌํฐ๋ ๊ทธ๋ ๋ค ์น๋๋ผ๋ ์์ ฏ ์๋ก๊ณ ์นจ ๋ฒ๊ทธ๊ฐ ์์์ต๋๋ค. ใ
์์ ฏ์ฑ์ ๋ฆฌ์กํธ ๋ค์ดํฐ๋ธ์์ ์ ๊ณตํ๋ Headless JS๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ๋ฐํ์ต๋๋ค. Headless JS๋ ๋ฐฑ๊ทธ๋ผ์ด๋์์ JavaScript๋ฅผ ์คํํ ์ ์๊ฒ ํด์ค๋๋ค. ๋ฆฌ์กํธ ๋ค์ดํฐ๋ธ๋ ์ญ์ ์งฑ์ ๋๋ค.ใ
์์ ฏ ์๋ ๋ฐฉ์์ ๋๋ต ์ด๋ ์ต๋๋ค. ์์ ฏ์ ์๋ก๊ณ ์นจ ๋ฒํผ์ ํฐ์นํ๋ฉด, ์์ ฏ ํ๋ก๋ฐ์ด๋(AppWidgetProvider)๊ฐ ํค๋๋ฆฌ์คJS์๋น์ค(HeadlessJsTaskService)๋ฅผ ํธ์ถํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ HeadlessJsTaskService์์๋ React Native์ ์๋ JavaScript๋ฅผ ์คํํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ JavaScript๋ ๋น๋๊ธฐ ํต์ ํ ๋ค์ ReactContextBaseJavaModule ๋ชจ๋์ ํธ์ถํ์ฌ Java ์ฝ๋์ ๊ฐ์ ์ ๋ฌํฉ๋๋ค. ์ด๋ ๊ฒ ์ค๋ช
ํ๊ณ ๋ณด๋ ๊ต์ฅํ ๋นํจ์จ์ ์ธ ๊ตฌ์กฐ๋ค์.
๊ทธ๋ฆฌ๊ณ Android O ๋ฒ์ (API 26)์๋ ํ๊ฐ์ง ๋ฌธ์ ์ ์ด ์์ต๋๋ค. AppWidgetProvider์์ HeadlessJsTaskService ์๋น์ค ํธ์ถ์ด ์ ๋ฉ๋๋ค. Context.startService(serviceIntent)๋ก ์๋น์ค๋ฅผ ํธ์ถํ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. ํด๊ฒฐ ๋ฐฉ๋ฒ์ targetSdkVersion์ ๋ฒ์ ์ ๋ฎ์ถ๋ฉด ๋๋ค๊ณ ํ๋ค์. ํ์ง๋ง ๊ฐ๋ฐ์์ ์๋ํ ์์กด์ฌ์ด ํ๋ฝํ์ง ์์ต๋๋ค.
์๋๋ก์ด๋ O์์๋ ์ฑ์ด ๋ฐฑ๊ทธ๋ผ์ด๋์ ์ง์ ํ๊ฒ ๋๋ฉด ๋ช๋ถ ๋ค ๋์ ์ค์ธ ๋ฐฑ๊ทธ๋ผ์ด๋ ์๋น์ค๋ ์๋์ผ๋ก ์ค์ง๋๋ฉฐ onDestroy()๊ฐ ํธ์ถ๋ฉ๋๋ค. ๋ํ์ฌ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ํ์์ ์๋น์ค๋ฅผ ๊ตฌ๋ํ๊ธฐ ์ํ startService()์ ํธ์ถ์ IllegalStateException์ด ๋ฐ์ํ๋ฉฐ ํ์ฉ๋์ง ์์ต๋๋ค.
- ์ถ์ฒ: https://medium.com/til-kotlin-ko/android-o%EC%97%90%EC%84%9C%EC%9D%98-%EB%B0%B1%EA%B7%B8%EB%9D%BC%EC%9A%B4%EB%93%9C-%EC%B2%98%EB%A6%AC%EB%A5%BC-%EC%9C%84%ED%95%9C-jobintentservice-250af2f7783c
๊ทธ๋์ Context.startForegroundService(serviceIntent)๋ฅผ ์ฌ์ฉํด์ ์๋น์ค๋ฅผ ํธ์ถํ์ต๋๋ค. ํ์ง๋ง startForegroundService๋ฅผ ์ฌ์ฉํ์ฌ ์๋น์ค๋ฅผ ํธ์ถํ๋ฉด, Android O์์๋ ์ํ๋ฐ์ Notification ์๋์ด ๋ฐ์ํฉ๋๋ค. ์์ ฏ์ ์๋ก ๊ณ ์น ๋๋ง๋ค ์๋์ด ๋ฐ์ํ๋ ๋ณด๊ธฐ์ ์ข์ง ์๋ค์. ๊ฒ๋ค๊ฐ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์คํ๋๋ Javascript๋ ๊ฐ๋ ๋คํธ์ํฌ ํต์ ์๋ต์ด ์์ ๋๊ฐ ์์ต๋๋ค. Javascript์์๋ connection timeout ์ปจํธ๋กคํ๊ธฐ๊ฐ ๋งค์ฐ ๊น๋ค๋กญ์ต๋๋ค.
๊ฒฐ๊ตญ ์๋๋ก์ด๋ Java ์ฝ๋๋ก ์์ ฏ์ ๋ค์ ๊ตฌํํ์์ต๋๋ค. ์ฑ ์คํ ํ๋ฉด์ ๋ฆฌ์กํธ ๋ค์ดํฐ๋ธ๋ก ๊ทธ๋๋ก ์ฌ์ฉํ๊ณ , ์์ ฏ๋ง ์๋๋ก์ด๋ Java๋ก ๊ตฌํํ์์ต๋๋ค. ์์ ฏ ํ๋ฉด ๊ฐฑ์ ์ ์ํด ์๋๋ก์ด๋ ๋ฒ์ 26.1.0์ ์ถ๊ฐ๋ JobIntentService๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌํํ์์ต๋๋ค.
JobIntentService๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐฑ๊ทธ๋ผ์ด๋ ์์ ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
AndroidManifest.xml ์ ์๋น์ค๋ฅผ ์ถ๊ฐํฉ๋๋ค.
<service android:name=".UpdateService"
android:permission="android.permission.BIND_JOB_SERVICE"
android:enabled="true"
android:exported="true" />
UpdateService์ ๋ค์๊ณผ ๊ฐ์ด ๊ตฌํํฉ๋๋ค.
public class UpdateService extends JobIntentService {
static final int JOB_ID = 1000;
static void enqueueWork(Context context, Intent work) {
enqueueWork(context, UpdateService.class, JOB_ID, work);
}
@Override
protected void onHandleWork(Intent intent) {
String username = intent.getStringExtra("username");
int[] appWidgetIds = intent.getIntArrayExtra("appWidgetIds");
new SteemAsyncTask(this, appWidgetIds).execute(username);
}
}
WidgetProvider์์๋ ์๋ก๊ณ ์นจ ๋ธ๋ก๋์บ์คํธ๊ฐ ๋ฐ์ํ๋ฉด UpdateService๋ฅผ ์คํํฉ๋๋ค.
public class WidgetProvider extends AppWidgetProvider {
// (...)
@Override
public void onReceive(final Context context, final Intent intent) {
// (...)
if (Constant.ACTION_REFRESH.equals(intent.getAction())) {
// AsyncLocalStorage ์์ username ๊ฐ์ ธ์ค๊ธฐ
ReactDatabaseSupplier rdbs = ReactDatabaseSupplier.getInstance(context);
SQLiteDatabase db = rdbs.get();
String username = AsyncLocalStorageUtil.getItemImpl(db, "username");
rdbs.closeDatabase();
if(username!=null && !username.isEmpty()) {
Intent intent = new Intent();
intent.putExtra("username", username);
intent.putExtra("appWidgetIds", appWidgetIds);
UpdateService.enqueueWork(context, intent); // ์๋น์ค ์คํ
}
}
}
์ฐธ๊ณ ๋ก ๋ฆฌ์กํธ ๋ค์ดํฐ๋ธ์ AsyncLocalStorage์ ์ ์ฅํ ๋ฐ์ดํฐ๋ฅผ ์๋ฐ ์ฝ๋์์ ์ฌ์ฉํ๋ ค๋ฉด, ๋ค์๊ณผ ๊ฐ์ด ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
ReactDatabaseSupplier rdbs = ReactDatabaseSupplier.getInstance(context);
SQLiteDatabase db = rdbs.get();
String username = AsyncLocalStorageUtil.getItemImpl(db, "username");
rdbs.closeDatabase();
์ฑ์ ์์ ํ์ฌ ๋ค์ ๋ฐฐํฌํ์์ต๋๋ค. ๋ณ๊ฒฝ ์ฌํญ์ ์๋์ ๊ฐ์ต๋๋ค.
- ๊ตฌ๊ธ ์คํ ์ด ๋ฐ๋ก๊ฐ๊ธฐ: https://play.google.com/store/apps/details?id=com.steem_widget
ํ์ฌ๊น์ง 10๋ถ์ด ์ฑ์ ์ค์นํด์ฃผ์
จ์ต๋๋ค. ์ฑ์ ์ค์นํ์ ๋ชจ๋ ๋ถ๋ค์๊ฒ ํญ์ ํ์ด์ด ๊น๋ค๊ธธ ๋น๋๋ค. ๋ถ์ ์ด๋ผ๊ณ ์๊ฐํ๊ณ ์ฑ์ ์ฌ์ฉํ์ผ๋ฉด ์ข๊ฒ ์ต๋๋ค. ๊ฐ์ฌํฉ๋๋ค.
์ฑ ๊ด๋ จ ํผ๋๋ฐฑ์ ๋๊ธ๋ก ๋ถํ๋๋ฆฝ๋๋ค.
ํดํผ ์ฝ๋ฉํ์ธ์~!