From ce719389982e826a67e8b390b0ddf434e41acdec Mon Sep 17 00:00:00 2001 From: sun5066 Date: Mon, 14 Mar 2022 00:18:09 +0900 Subject: [PATCH 1/5] =?UTF-8?q?=EC=84=9C=EB=B9=84=EC=8A=A4=20=EC=8A=A4?= =?UTF-8?q?=ED=84=B0=EB=94=94=201=EC=B0=A8=20=EC=BB=A4=EB=B0=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/github/sun5066/lifecycle/TestService.kt | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 1_Activity_Fragment_LifeCycle_And_Context/minseok/lifecycle/app/src/main/java/github/sun5066/lifecycle/TestService.kt diff --git a/1_Activity_Fragment_LifeCycle_And_Context/minseok/lifecycle/app/src/main/java/github/sun5066/lifecycle/TestService.kt b/1_Activity_Fragment_LifeCycle_And_Context/minseok/lifecycle/app/src/main/java/github/sun5066/lifecycle/TestService.kt new file mode 100644 index 0000000..80cc659 --- /dev/null +++ b/1_Activity_Fragment_LifeCycle_And_Context/minseok/lifecycle/app/src/main/java/github/sun5066/lifecycle/TestService.kt @@ -0,0 +1,12 @@ +package github.sun5066.lifecycle + +import android.app.Service +import android.content.Intent +import android.os.IBinder + +class TestService : Service() { + + override fun onBind(intent: Intent): IBinder { + TODO("Return the communication channel to the service.") + } +} \ No newline at end of file From 314681ff6a6f8e893af83945ddadfb5b7306e8ef Mon Sep 17 00:00:00 2001 From: sun5066 Date: Mon, 14 Mar 2022 00:18:26 +0900 Subject: [PATCH 2/5] =?UTF-8?q?=EC=84=9C=EB=B9=84=EC=8A=A4=202=EC=B0=A8=20?= =?UTF-8?q?=EC=BB=A4=EB=B0=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../minseok/lifecycle/.idea/compiler.xml | 2 +- .../minseok/lifecycle/.idea/gradle.xml | 4 +- .../minseok/lifecycle/.idea/misc.xml | 2 +- .../app/src/main/AndroidManifest.xml | 10 +- .../github/sun5066/lifecycle/TestService.kt | 53 +++++- .../lifecycle/ui/activity/MainActivity.kt | 34 ++++ .../app/src/main/res/layout/activity_main.xml | 10 ++ .../minseok/lifecycle/build.gradle | 2 +- 4_Service_Component/minseok/service.md | 162 ++++++++++++++++++ 9 files changed, 269 insertions(+), 10 deletions(-) create mode 100644 4_Service_Component/minseok/service.md diff --git a/1_Activity_Fragment_LifeCycle_And_Context/minseok/lifecycle/.idea/compiler.xml b/1_Activity_Fragment_LifeCycle_And_Context/minseok/lifecycle/.idea/compiler.xml index fb7f4a8..61a9130 100644 --- a/1_Activity_Fragment_LifeCycle_And_Context/minseok/lifecycle/.idea/compiler.xml +++ b/1_Activity_Fragment_LifeCycle_And_Context/minseok/lifecycle/.idea/compiler.xml @@ -1,6 +1,6 @@ - + \ No newline at end of file diff --git a/1_Activity_Fragment_LifeCycle_And_Context/minseok/lifecycle/.idea/gradle.xml b/1_Activity_Fragment_LifeCycle_And_Context/minseok/lifecycle/.idea/gradle.xml index 50a6577..13bb51f 100644 --- a/1_Activity_Fragment_LifeCycle_And_Context/minseok/lifecycle/.idea/gradle.xml +++ b/1_Activity_Fragment_LifeCycle_And_Context/minseok/lifecycle/.idea/gradle.xml @@ -4,10 +4,9 @@ diff --git a/1_Activity_Fragment_LifeCycle_And_Context/minseok/lifecycle/.idea/misc.xml b/1_Activity_Fragment_LifeCycle_And_Context/minseok/lifecycle/.idea/misc.xml index 60b6ebf..abcadf2 100644 --- a/1_Activity_Fragment_LifeCycle_And_Context/minseok/lifecycle/.idea/misc.xml +++ b/1_Activity_Fragment_LifeCycle_And_Context/minseok/lifecycle/.idea/misc.xml @@ -7,7 +7,7 @@ - + diff --git a/1_Activity_Fragment_LifeCycle_And_Context/minseok/lifecycle/app/src/main/AndroidManifest.xml b/1_Activity_Fragment_LifeCycle_And_Context/minseok/lifecycle/app/src/main/AndroidManifest.xml index e601735..9930e7f 100644 --- a/1_Activity_Fragment_LifeCycle_And_Context/minseok/lifecycle/app/src/main/AndroidManifest.xml +++ b/1_Activity_Fragment_LifeCycle_And_Context/minseok/lifecycle/app/src/main/AndroidManifest.xml @@ -12,8 +12,14 @@ android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.Lifecycle"> - - + + + diff --git a/1_Activity_Fragment_LifeCycle_And_Context/minseok/lifecycle/app/src/main/java/github/sun5066/lifecycle/TestService.kt b/1_Activity_Fragment_LifeCycle_And_Context/minseok/lifecycle/app/src/main/java/github/sun5066/lifecycle/TestService.kt index 80cc659..1fc3c70 100644 --- a/1_Activity_Fragment_LifeCycle_And_Context/minseok/lifecycle/app/src/main/java/github/sun5066/lifecycle/TestService.kt +++ b/1_Activity_Fragment_LifeCycle_And_Context/minseok/lifecycle/app/src/main/java/github/sun5066/lifecycle/TestService.kt @@ -1,12 +1,59 @@ package github.sun5066.lifecycle -import android.app.Service import android.content.Intent +import android.content.ServiceConnection +import android.os.Binder import android.os.IBinder +import android.util.Log +import androidx.lifecycle.LifecycleService +import androidx.lifecycle.lifecycleScope +import kotlinx.coroutines.flow.flow +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach -class TestService : Service() { +class TestService : LifecycleService() { + + override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { + super.onStartCommand(intent, flags, startId) + Log.d("123123", "onStartCommand()") + return START_NOT_STICKY + } override fun onBind(intent: Intent): IBinder { - TODO("Return the communication channel to the service.") + super.onBind(intent) + Log.d("123123", "onBind()") + return LocalBinder() + } + + override fun onCreate() { + super.onCreate() + Log.d("123123", "onCreate()") + } + + override fun onRebind(intent: Intent?) { + Log.d("123123", "onRebind()") + super.onRebind(intent) + } + + override fun onUnbind(intent: Intent?): Boolean { + Log.d("123123", "onUnbind()") + return super.onUnbind(intent) + } + + override fun onDestroy() { + super.onDestroy() + Log.d("123123", "onDestroy()") + } + + fun count() { + flow { + (0..10).forEach { emit(it) } + }.onEach { + Log.d("123123", "count: $it") + }.launchIn(lifecycleScope) + } + + inner class LocalBinder : Binder() { + val service: TestService get() = this@TestService } } \ No newline at end of file diff --git a/1_Activity_Fragment_LifeCycle_And_Context/minseok/lifecycle/app/src/main/java/github/sun5066/lifecycle/ui/activity/MainActivity.kt b/1_Activity_Fragment_LifeCycle_And_Context/minseok/lifecycle/app/src/main/java/github/sun5066/lifecycle/ui/activity/MainActivity.kt index aefce36..1ba22d4 100644 --- a/1_Activity_Fragment_LifeCycle_And_Context/minseok/lifecycle/app/src/main/java/github/sun5066/lifecycle/ui/activity/MainActivity.kt +++ b/1_Activity_Fragment_LifeCycle_And_Context/minseok/lifecycle/app/src/main/java/github/sun5066/lifecycle/ui/activity/MainActivity.kt @@ -1,25 +1,44 @@ package github.sun5066.lifecycle.ui.activity import android.Manifest +import android.content.ComponentName +import android.content.Intent +import android.content.ServiceConnection import android.os.Bundle +import android.os.IBinder +import android.util.Log import android.view.View import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.viewModels import androidx.core.os.bundleOf import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentManager +import androidx.lifecycle.lifecycleScope import github.sun5066.data.model.ImageData import github.sun5066.lifecycle.R +import github.sun5066.lifecycle.TestService import github.sun5066.lifecycle.databinding.ActivityMainBinding import github.sun5066.lifecycle.ui.fragment.DetailFragment import github.sun5066.lifecycle.ui.fragment.ListFragment import github.sun5066.lifecycle.ui.state.LastViewState import github.sun5066.lifecycle.ui.state.LifeCycleModeState import github.sun5066.lifecycle.viewmodel.MainViewModel +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach class MainActivity : BaseActivity() { private val mainViewModel by viewModels() + private var testServiceBinder: TestService.LocalBinder? = null + private val serviceConnection = object : ServiceConnection { + override fun onServiceConnected(name: ComponentName?, service: IBinder?) { + testServiceBinder = service as TestService.LocalBinder + } + + override fun onServiceDisconnected(name: ComponentName?) { + testServiceBinder = null + } + } private val requestPermissionLauncher = registerForActivityResult(ActivityResultContracts.RequestPermission()) { granted -> @@ -42,6 +61,21 @@ class MainActivity : BaseActivity() { showListFragment() } } + + binding.btn.setOnClickListener { + testServiceBinder?.service?.count() + } + } + + override fun onResume() { + super.onResume() + val intent = Intent(this, TestService::class.java) + bindService(intent, serviceConnection, BIND_AUTO_CREATE) + } + + override fun onPause() { + super.onPause() + unbindService(serviceConnection) } private fun showListFragment() { diff --git a/1_Activity_Fragment_LifeCycle_And_Context/minseok/lifecycle/app/src/main/res/layout/activity_main.xml b/1_Activity_Fragment_LifeCycle_And_Context/minseok/lifecycle/app/src/main/res/layout/activity_main.xml index 24c28b0..fa1c72b 100644 --- a/1_Activity_Fragment_LifeCycle_And_Context/minseok/lifecycle/app/src/main/res/layout/activity_main.xml +++ b/1_Activity_Fragment_LifeCycle_And_Context/minseok/lifecycle/app/src/main/res/layout/activity_main.xml @@ -8,6 +8,16 @@ android:layout_height="match_parent" tools:context=".ui.activity.MainActivity"> +