백그라운드 모드에서 서비스로 실행되도록 Android 앱 작성

일부 사용 사례에서 사용자가 앱을 백그라운드 모드 또는 화면 잠금 상태로 전환하면 몇 분 후에 앱 기능이 손실되는 문제가 발생할 수 있습니다. 이것은 좋은 사용자 경험이 아니며, 이로 인해 Bluetooth 장치가 앱에서 연결 해제되거나 백그라운드에서 서버와의 데이터 동기화가 중단될 수 있습니다. 그러면 사용자는 앱의 연결성과 안정성에 대해 불평할 것입니다.

이 문제를 해결하려면 먼저 Android 앱 활동 수명 주기를 약간 이해해야 합니다. 사용자가 주의가 산만해져 앱 대신 포그라운드에서 Facebook 앱을 열면 앱 활동이 종료되고 onDestroy()가 트리거됩니다. 이것은 사용하지 않는 메모리를 비우고 더 나은 배터리 관리를 제공하므로 안드로이드 시스템에 좋습니다. 그러나 이는 앱이 종료되고 상태와 기능이 손실되기 때문에 앱에 좋지 않을 수 있습니다.

다음 단계에서는 앱을 리팩터링하여 Bluetooth 연결과 같은 백그라운드 기능을 서비스로 분리해야 합니다. 서비스는 사용자 인터페이스와 독립적으로 백그라운드에서 장기 실행 작업을 수행할 수 있는 애플리케이션 구성 요소입니다. 다음은 서비스 코드의 예입니다.

import android.app.Service

class MyService : Service() {

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

    override fun onCreate() {
      // move your service logic here 
    }

    override fun onDestroy() {
      // clean up your service logic here
    }

}


이 서비스를 사용하려면 AndroidManifest.xml에서도 정의해야 합니다. 예를 들면 다음과 같습니다(이름을 서비스 패키지 이름으로 대체).

<application>
    ...
    <service android:enabled="true" android:name="com.victorleungtw.myapp.services.MyService"></service>

</application>


Activity onCreate와 같은 활동에서 이 서비스에 대한 시작을 트리거하려면 다음 행을 추가하십시오.

startService(Intent(this, MyService::class.java))


또한 서비스를 중지하려는 위치에 다음 줄을 추가합니다.

stopService(Intent(this, BleService::class.java))


이 변경 후에는 앱이 더 잘 구성되지만 아직 백그라운드 모드에서 계속 실행할 수는 없습니다. 이렇게 하려면 서비스 내에서 두 가지 메서드를 더 추가해야 합니다.

class MyService : Service() {

    @RequiresApi(Build.VERSION\_CODES.O)
    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {

        val channelId =
                if (Build.VERSION.SDK\_INT >= Build.VERSION\_CODES.O) {
                    createNotificationChannel("my\_service", "My Background Service")
                } else {
                    // If earlier version channel ID is not used
                    ""
                }

        val notification: Notification = Notification.Builder(this, channelId)
                .setContentTitle("title")
                .setContentText("text")
                .build()
        startForeground(2001, notification)

        return START\_STICKY
    }

    @RequiresApi(Build.VERSION\_CODES.O)
    private fun createNotificationChannel(channelId: String, channelName: String): String{
        val chan = NotificationChannel(channelId,
                channelName, NotificationManager.IMPORTANCE\_NONE)
        chan.lightColor = Color.BLUE
        chan.lockscreenVisibility = Notification.VISIBILITY\_PRIVATE
        val service = getSystemService(Context.NOTIFICATION\_SERVICE) as NotificationManager
        service.createNotificationChannel(chan)
        return channelId
    }

}


여기서 일어나는 일은 앱이 백그라운드에서 계속 실행될 때 사용자가 알 수 있도록 알림이 생성된다는 것입니다. 다음과 같이 표시됩니다.



그게. 이제 사용자는 앱 기능에 따라 백그라운드에서 앱을 실행하고 Bluetooth에 연결하고 사용자 데이터를 동기화하거나 음악을 재생하면서 포그라운드에서 Facebook 앱을 읽는 동안 멀티태스킹을 할 수 있습니다.

2020년 9월 12일 https://victorleungtw.com에 원래 게시되었습니다.

좋은 웹페이지 즐겨찾기