我可以在Android中使用Hilt创建服务的示例吗?

lymnna71  于 2023-05-05  发布在  Android
关注(0)|答案(1)|浏览(186)

通常,我可以使用代码B通过Hilt自动创建示例。
Code A中有一个Android Studio的Service类,我可以使用Hilt创建Service的示例吗?

代码A

class RecordService : Service() {
        private val CHANNEL_ID ="channel__voice_record"

        private var mRecorder: MediaRecorder? = null

        override fun onBind(intent: Intent): IBinder {
            return MyBinder()
        }

        inner class MyBinder : Binder() {
            val service: RecordService
            get() = this@RecordService
       }
        ...
   }  

  fun bindService() {
        Intent(mApplication , RecordService::class.java).also { intent ->
            mApplication.bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE)
        }
    }

    fun unbindService() {
        Intent(mApplication, RecordService::class.java).also { intent ->
            mApplication.unbindService(serviceConnection)
            mService?.stopForeground(true)
            mService?.stopSelf()
        }
    }

代码B

@InstallIn(SingletonComponent::class)
@Module
abstract class SoundModule {
    @Binds
    abstract fun bindIHandleMeter(impl: HandleMeter): IHandleMeter
}

@InstallIn(SingletonComponent::class)
@Module
object ObjectModule {

    @Provides
    @Singleton
    fun provideMediaPlayer(): MediaPlayer {
        return MediaPlayer()
    }
}

新增内容

致米哈伊尔·古里亚耶夫:谢谢!
但是从article,似乎Service类可以被Hilt自动示例化,你可以看到图像。

图片

新增内容

致米哈伊尔·古里亚耶夫:再次感谢!
我可以使用代码C而不添加代码@AndroidEntryPoint吗?

代码C

class RecordService @Inject constructor(
   private val translateService: ITranslateService
): Service() {
    ...
}

还有,Hilt能在Code C中自动创建RecordService的示例吗?我能像代码D一样使用Hilt创建的示例吗?

代码D

@AndroidEntryPoint
class ActivityMain : ComponentActivity() {
       @Inject lateinit var recordService RecordService
         ...
 }
t0ybt7op

t0ybt7op1#

您不能自己创建Activity组件的示例(这没关系,它将由您在代码中创建或由Hilt模块提供)。确切地说,您将能够创建Service类的示例,但无法正确使用它。
当您调用Context.startActivity(intent: Intent)Context.startService(intent: Intent)方法时,Android系统正在创建ActivityService示例。这是启动这些Android组件的唯一正确方法。

更新

关于你的截图的更新。对Service的支持意味着你可以用@AndroidEntryPoint注解来标记你的Service类,告诉hilt将依赖注入到你的Service类中。看看下面这个片段。在这里,通过使用@AndroidEntryPoint注解标记您的服务,您告诉Hilt将属性注入到这个类中,因此someRecorder变量将由Hilt注入到您的RecordService中。

@AndroidEntryPoint
class RecordService : Service() {

    @Inject
    lateinit var someRecorder: Recorder

    ...

}

更新№2不,您不能使用代码片段C中的代码。因为正如我上面所描述的,Android系统在后台自动创建Service类。在我上面的代码中可以看到对Service的参数的正确注入。

但是你可以使用来自Snippet D的代码。因为Activty将由Android创建,然后@AndroidEntryPoint注解告诉Hilt注入标有@Inject注解的参数

相关问题