마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

앱 장시간 사용안할 시 자동 꺼짐...

0 추천

개발 중인 앱은 블루투스 연결하여 실시간으로 데이터를 받아서 화면에 그래프로 보여주는 앱입니다.

데이터 수신이 시작이되면 화면을 항상 켜지게 설정합니다.

상태창에 알림창도 주기적으로 동작 시간을 업데이트해주고 있습니다.

동작 후 홈버튼으로 앱을 백그라운드로 넘기면 사용자가 정지하기전까지 계속해서 작동이 되는데

앱을 켜놓으면 일정 시간이후 동작하다가 자동으로 앱이 종료됩니다...

딱히 오류 메시지도 나오지도 않고있어서 어떻게 해결할지 막막합니다.

같은 경험 있으신분이나 해결 방법 좀 부탁드립니다.

내동생장군 (240 포인트) 님이 2018년 9월 20일 질문

2개의 답변

0 추천
앱은 하나의 '리눅스 프로세스'입니다. 안드로이드는 화면에 보이지 않는 프로세스는

배터리 소모 문제로 일정 시간 이후에 강제로 종료 시킵니다.

개발 중인 앱이 서비스로 백그라운드로 동작한다면 해당 서비스를 foregroundService로

설정하여 notification 영역에서 사용자에게 동작 중을 고지하면

안드로이드는 강제 종료를 수행하지 않습니다.
디자이너정 (42,810 포인트) 님이 2018년 9월 21일 답변
답변감사합니다.
작성해주신 답변의 내용이 "상태창에서도 알림창을 주기적으로 동작 시간 업데이트"하는 부분인것 같습니다.
업데이트하는 부분을 foregroundService로 만들어서 동작시켰더니 앱을 백그라운드로 넘겨도 장시간 동작되더군요.
하지만 앱을 백그라운드로 넘기지 않는 상태에서 장시간 사용시 강제 종료돼서 그렇습니다..ㅜ
0 추천

프로세스가 종료 되지 않게 하려면 WAKE_LOCK 을 설정 해야합니다.

https://developer.android.com/training/scheduling/wakelock

앱이 백그라운드로 갔을때도 데이터를 받으려면 서비스로 만들고 WAKE_LOCK 을 설정하는 것이 맞는것 같은데 이경우  배터리 문제가 발생할 수 있습니다.  단순히 데이터만 표시해주는 기능을 하는 앱이라면 앱이 활성화 될때  매번 onResume(), onPause()에서  블루투스 커넥션을 연결하거나 종료하는 것을 추천합니다.

매니페스트 파일에 권한을 추가하고

 

<uses-permission android:name="android.permission.WAKE_LOCK" />

웨이크 락을 설정합니다.

package kr.luxsoft.example.testwakelock;

import android.content.Context;
import android.os.PowerManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

   static final String TAG = "MainActivity";

    private PowerManager.WakeLock wl;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
         wl = pm.newWakeLock( PowerManager.PARTIAL_WAKE_LOCK ,   TAG);
    }


    @Override
    protected void onPause() {
        super.onPause();
        wl.release();
    }

    @Override
    protected void onResume() {
        super.onResume();
        wl.acquire();
    }
}
luxsoft (1,780 포인트) 님이 2018년 9월 27일 답변
luxsoft님이 2018년 9월 27일 수정
...