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

Background Service 화면이 켜져있거나, 충전 상태에서만 작동을 해요

0 추천

Background Service 가 Display ON상태거나, OFF 상태이지만 충전이 진행중(케이블 연결)이면 정상적으로 작동을 합니다.  하지만 Display OFF상태에서 충전을하지 않고 있으면 실행이 되질 않습니다.(베터리는 충전풀상태)

도대체 어디가 잘못되었는지 모르겠습니다. 도움 부탁드립니다.

<Manifest.xml >

  <uses-permission android:name="android.permission.INTERNET" />   
  <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 
 <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> 
 <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/> 
 <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>     
 <uses-permission android:name="android.permission.GET_TASKS"/>
 <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

<service android:name=".BackgroundService" android:exported="false" />

 

<MainActivity.java>

protected void onCreate(Bundle savedInstanceState) {

  receiver = new BroadcastReceiver() {
         @Override
         public void onReceive(Context context, Intent intent) {
         Message msg = new Message();
          if(intent.getStringExtra("end") != null){
           handler.sendEmptyMessage(1);
          }else{
           String result = intent.getStringExtra("result");
     msg.what = 0;
     msg.obj  = result;
     handler.sendMessage(msg);
          }
         }
     };

}

==버튼클릭시==

Intent serviceIntent = new Intent(this.getBaseContext(), BackgroundService.class);
serviceIntent.putExtra("kwd" , et_kwd.getText().toString());
serviceIntent.putExtra("url" , et_url.getText().toString());
serviceIntent.putExtra("stay", et_stay.getText().toString());
startService(serviceIntent); 

 

<Backgroundservice.java>

private static LocalBroadcastManager broadcaster;
private static Thread mThread;
public static boolean serviceRunning = false;

 @Override
 public void onCreate(){
  super.onCreate();
  broadcaster = LocalBroadcastManager.getInstance(this);
  //stopTask = false;  
  serviceRunning = true;
 }

 @Override
 public void onStart(Intent intent, int startId) {
  invokeService(intent);
 }

//백그라운드 실제 작업실행

 public void invokeService(Intent intent){

     if (mThread == null) {
      mThread = new BackgroundThread();
      mThread.start();
     }else if(mThread.isAlive() == false) {
      mThread.start();
     }

}

우리벼리 (220 포인트) 님이 2014년 11월 4일 질문

1개의 답변

0 추천
자답입니다.

AlarmManager를 이용해서 주기적으로 폰을 깨운뒤 서비스를 재시작하는 형태로 처리를 하였습니다.

혹시 더 좋은 방법 있으시면 답변 부탁드립니다.
우리벼리 (220 포인트) 님이 2014년 11월 10일 답변
2달정도 지났는데 확인하실지 모르겠네요,
저역시 Background에서 돌때로그를 찍어놓았는데,,
화면이 꺼지면 일정시간이 지난후 더이상 서비스가 작동하지 않습니다.

알아보니 CPU가 lock이 걸려 휴대전화가 가수면 상태에 빠져있더라구요.

저역시 알람매니저를 이용하여
알람매니저내에서 wake lock 을 이용해 해결을 하긴하였는데,
이게 맞는지 모르겠네요..

GCM관련 코드를 보니
BroadcastReceiver가 아예 WakefulBroadcastReceiver라는 것을 상속받았더라구요.

조금더 좋은 소스가 있는지..저도 알고싶네요
...