2014-10-18 15 views
7

Ich habe Hintergrund-Service in meiner Android-App, ich starte Service von MainActivity onResume() -Methode und es funktioniert korrekt.Aber wie kann ich den Dienst stoppen, wenn der Benutzer die Home-Taste drücken Benutzer Presse Home-Taste dann Anwendung Umzug in dem Hintergrund und dann Benutzer öffnen eine andere App dann nach einiger Zeit meine Service-Methode aufgerufen wird und App-Kraft stop.Below ist mein Code für Start-Service -Stop Hintergrund Service Wenn die Anwendung in den Hintergrund geht

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

Vielen Dank im Voraus.

In My Service i Code unten verwenden EDITED -

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(); 
} 

in meiner Tätigkeit i Code unten verwenden für Stop-Service -

@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(); 
} 

aber mein Service ist während laufen Ich benutze eine andere App und es erzwinge Stop app.Von Hintergrund-Service rufe ich einige Webservice und dann speichern Antwort des Dienstes in der Datenbank.

Antwort

5

Beenden Sie den Dienst in onPause() und OnStop()

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

Presse Home Button Ursache OnPause() Funktion. Außer Kraft setzen onPause() und rufen Stopservice: mContext.stopService (neu Intent (mContext, MyBackgroundService.class))

+0

Bitte überprüfen Sie die aktualisierte Frage.Ich habe versucht, Ihren Code, aber immer noch App-Absturz, während App im Hintergrund ist und einige andere App läuft. – Ravi

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

// schreiben Sie hier Ihren Code die Aktivität 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();  
    } 

die zu stoppen Der obige Code überprüft, ob der Benutzer die Home-Taste gedrückt hat oder nicht.

+1

Ich habe versucht, Ihren Code, aber wenn Home-Taste gedrückt wird dann OnKeyDown-Methode nicht aufgerufen. – Ravi

+0

Bitte überprüfen Sie meine aktualisierte Frage – Ravi

+0

Sie müssen ui von Ihrem Hintergrunddienst aktualisieren, die den Absturz verursachen kann. Wenn dies der Fall ist, müssen Sie eine Prüfung auf den Kontext Ihrer Aktivität anwenden und sie bei der OnPause- und Onkey-Down-Methode auf null setzen, bevor Sie die Aktualisierung vornehmen. – amit

1

Wenn wir die anderen Anwendungen öffnen, wird unsere Anwendung (die im Hintergrund war) aus dem Speicher gelöscht. Die gesamte Anwendung wird jedoch nicht entfernt, aber die unerwünschten Daten und Aktivitäten werden beendet. In Ihrem Fall wird die Aktivität, die aktualisiert werden soll, aus dem Speicher und Ihrem laufenden Hintergrunddienst gelöscht, wenn Sie versuchen, die Benutzeroberfläche zu aktualisieren, dann wird sie durch das Werfen von NullPointerException abgestürzt.

Bitte speichern Sie die Referenz der Aktivität (deren UI aktualisiert werden soll) in onCreate() und setzen Sie den Verweis auf null in finish() - Methode dann überprüfen Sie diese Referenz im Hintergrund-Service, wenn es nicht null ist dann aktualisieren die UI sonst keine Aktualisierung.

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

in Ihrer Tätigkeit

onCreate(){ 
    GlobalReference.activityRef = this; 
} 


finish(){ 
    GlobalReference.activityRef = null; 
} 

In Ihrem Hintergrunddienst

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

Hoffnung wird dieser Code Ihr Problem lösen. Happy Coding ...