2014-10-18 5 views
7

내 안드로이드 응용 프로그램에 백그라운드 서비스가 있습니다. MainActivity onResume() 메소드에서 서비스를 시작하고 제대로 작동합니다. 그러나 사용자가 홈 버튼을 누르면 어떻게 서비스를 중지 할 수 있습니까? 현재 언제입니까? 사전에배경 서비스 중지 응용 프로그램이 백그라운드로 이동하면

Intent msgIntent = new Intent(mContext, MyBackgroundService.class); 
     startService(msgIntent); 

감사합니다 - 약간의 시간이 내 서비스 메서드 호출 및 응용 프로그램 강제 stop.Below가 시작 서비스에 대한 내 코드 후 다음 사용자를 눌러 홈 버튼 배경에 응용 프로그램을 이동 한 후 사용자는 다른 응용 프로그램을 엽니 다.

내가 코드를 아래에 사용할 내 서비스에서

편집 - 내가 스톱 서비스에 대한 코드 아래 사용 내 활동에

public void callAsynchronousTask() { 
final Handler handler = new Handler(); 
timer = new Timer(); 
TimerTask doAsynchronousTask = new TimerTask() {  
    @Override 
    public void run() { 
     handler.post(new Runnable() { 
      public void run() {  
       try { 
        callWebservice(); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 
}; 
timer.schedule(doAsynchronousTask, START_DELAY, DELAY); 
} 

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    callAsynchronousTask(); 
    return Service.START_NOT_STICKY; 
} 

@Override 
public void onCreate() { 
    mContext = this; 
    super.onCreate(); 
} 

@Override 
public IBinder onBind(Intent intent) { 
    return null; 
} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    if(timer!=null){ 
     timer.cancel(); 
    } 
    stopSelf(); 
} 

-

@Override 
protected void onStop() { 
    try{ 
     stopService(new Intent(this, MyBackgroundService.class)); 
     isServiceRunning = false; 
    } 
    catch(Exception e){ 
    e.printStackTrace(); 
    } 
    super.onStop(); 
} 

@Override 
protected void onPause() { 
    try{ 
     stopService(new Intent(this, MyBackgroundService.class)); 
     isServiceRunning = false; 
    } 
    catch(Exception e){ 
     e.printStackTrace(); 
    } 
    super.onPause(); 
} 

하지만 내 서비스는 동안 실행됩니다 일부 다른 애플 리케이션을 사용하고 강제 app.From 백그라운드 서비스에서 일부 webservice를 호출하고 데이터베이스에 서비스의 응답을 저장합니다.

답변

5

중지 onPause에서 서비스() 및 이동 중지()

mContext.stopService(new Intent(mContext, 
        MyBackgroundService.class)) 
0

눌러 홈 버튼 원인 OnPause() 함수. onPause를 (재정) 및 전화 stopService : mContext.stopService (새 의도 (mContext, MyBackgroundService.class))

+0

업데이트 된 질문을 확인하십시오. 앱이 백그라운드에서 실행 중이며 다른 앱이 실행 중일 때 코드가 있지만 여전히 앱이 다운되어 버렸습니다. – Ravi

1
@Override 
    public boolean onKeyDown(int keyCode, KeyEvent event) { 
     if(keyCode==KeyEvent.KEYCODE_HOME){ 
      Log.e("home key pressed", "****"); 

// 활동을 중지 여기에 코드를 작성 enter code here

 } 
     return super.onKeyDown(keyCode, event); 
    } 

    @Override 
    protected void onPause() { 
     Log.e("home key pressed on pause", "****"); 
     // write your code here to stop your service 
     super.onPause();  
    } 

위 코드는 사용자가 홈 버튼을 눌렀는지 확인합니다.

+1

귀하의 코드를 시도했지만 홈 단추를 누르면 onKeyDown 메서드가 호출되지 않습니다. – Ravi

+0

업데이트 된 질문 – Ravi

+0

을 확인하십시오. 충돌을 일으킬 수있는 백그라운드 서비스에서 ui를 업데이트해야합니다. 그렇다면 활동 컨텍스트에 대한 확인을 적용하고 onPause 및 Onkey down 메서드에서 null을 확인한 다음 UI를 업데이트하기 전에이를 확인해야합니다. – amit

1

우리가 다른 응용 프로그램을 열면 응용 프로그램 (백그라운드에서 실행 됨)이 메모리에서 지워지지만 전체 응용 프로그램은 제거되지 않지만 일부 원치 않는 데이터와 활동은 완료됩니다. UI 업데이트를 시도 할 때 업데이트 될 활동이 메모리 및 실행중인 백그라운드 서비스에서 삭제되면 NullPointerException이 발생하여 충돌이 발생합니다.

onCreate()에서 activty (UI가 업데이트 될 참조) 참조를 저장하고 finish() 메소드에서 참조를 null로 설정 한 다음 백그라운드 서비스에서이 참조를 확인한 다음 null이 아닌 경우 update 그렇지 않으면 UI가 업데이트되지 않습니다. 당신의 백그라운드 서비스에서 활동

onCreate(){ 
    GlobalReference.activityRef = this; 
} 


finish(){ 
    GlobalReference.activityRef = null; 
} 

에서

// Global Class for saving the reference 
class GlobalReference{ 
     public static <name_of_your_activity> activityRef; 
} 

if(GlobalReference.activityRef != null){ 
    // update the UI of your activity 
} 

희망이 코드는 문제를 해결할 것입니다. 해피 코딩 ...