MainActivity와 WorkManager 간의 데이터 전달 방법

최대환·2023년 12월 31일

MainActivity에서 WorkManager로 데이터를 전달하려면 .setInputData(myData)를 사용해 보내면 됩니다. 아래 코드는 ab라는 키로 각각 10, 20이라는 값을 가진 Data를 생성하고, 이를 WorkManagerB로 전달하는 예시입니다.

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val myData : Data = workDataOf(
            "a" to 10,
            "b" to 20
        )

        val workManagerB = OneTimeWorkRequestBuilder<WorkManagerB>().setInputData(myData).build()
        WorkManager.getInstance(this).enqueue(workManagerB)
    }
}

WorkManager에서는 inputData.getInt("a", 1000)를 사용해서 값을 받을 수 있습니다.

class WorkManagerB(context : Context, workerParameters: WorkerParameters) :
    Worker(context, workerParameters){

    override fun doWork(): Result {
        val a = inputData.getInt("a", 1000)
        val b = inputData.getInt("b", 2000)
        val c = inputData.getInt("c", 3000)

        Log.d("WorkManagerB", a.toString())
        Log.d("WorkManagerB", b.toString())
        Log.d("WorkManagerB", c.toString())

        return Result.success()
    }
}

MainActivity로 값을 보낼 때는 return Result.success(output)를 사용해서 보내면 됩니다.

class WorkManagerB(context : Context, workerParameters: WorkerParameters) :
    Worker(context, workerParameters){

    override fun doWork(): Result {
        val a = inputData.getInt("a", 1000)
        val b = inputData.getInt("b", 2000)
        val c = inputData.getInt("c", 3000)

        Log.d("WorkManagerB", a.toString())
        Log.d("WorkManagerB", b.toString())
        Log.d("WorkManagerB", c.toString())

        val output : Data = workDataOf("result" to 123)

        return Result.success(output)
    }
}

아래 코드는 WorkManager로부터 결과 값을 반환받는 방법을 보여줍니다.

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val myData : Data = workDataOf(
            "a" to 10,
            "b" to 20
        )

        val workManagerB = OneTimeWorkRequestBuilder<WorkManagerB>().setInputData(myData).build()
        WorkManager.getInstance(this).enqueue(workManagerB)

        WorkManager.getInstance(this).getWorkInfoByIdLiveData(workManagerB.id)
            .observe(this, Observer { info ->
                if(info != null && info.state.isFinished) {
                    val result = info.outputData.getInt("result", 299)
                    Log.d("MainActivity", result.toString())
                }
            })
    }
}
profile
나의 개발지식 output 공간

0개의 댓글