2014-10-18 178 views
7

我在我的android應用程序中有後臺服務,我從MainActivity onResume()方法啓動服務,並且它工作正常。但是當用戶按Home按鈕時,如何停止服務。因爲當前時用戶按Home鍵,然後應用移動到後臺,然後用戶打開一些其他的應用程序,然後一段時間我的服務方法被調用,應用力stop.Below是我開始服務代碼後 -停止後臺服務當應用程序轉到後臺

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

在此先感謝。

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

我用下面的代碼一站式服務 -

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

,但我的服務運行,而我使用一些其他的應用程序,它強制停止應用程序。從後臺服務我打電話給一些web服務,然後將服務響應存儲在數據庫中。

回答

5

停止在的onPause服務()和的onStop()

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

按Home鍵事業的onPause()函數。覆蓋的onPause()並調用stopService: mContext.stopService(新意圖(mContext, MyBackgroundService.class))

+0

請檢查更新的問題。因爲我已經嘗試了您的代碼,但仍然應用程序崩潰,而應用程序在後臺和其他應用程序正在運行。 – Ravi 2014-10-18 12:17:27

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

的上面的代碼會檢查用戶是否按下了home按鈕。

+1

我已經嘗試了你的代碼,但當主頁按鈕被按下時,onKeyDown方法不會被調用。 – Ravi 2014-10-18 12:06:33

+0

請檢查我更新的問題 – Ravi 2014-10-18 12:16:34

+0

您必須從後臺服務更新ui,這可能會導致崩潰。如果是這樣,您需要對您的活動環境應用檢查,並在onPause和Onkey down方法上使其爲null,然後在更新ui之前檢查它。 – amit 2014-10-18 12:26:10

1

當我們打開其他應用程序時,我們的應用程序(在後臺)從內存中清除。但是整個應用程序不會被刪除,但一些不需要的數據和活動會完成。 在你的情況下,當嘗試更新UI時,要更新的活動將從內存和正在運行的後臺服務中清除,然後通過拋出NullPointerException來崩潰。

所以請保存在onCreate()中的活動的引用(其UI將被更新),並在finish()方法中將引用設置爲null,然後在後臺服務中檢查此引用,如果它不爲null,則更新用戶界面,否則沒有更新。

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

在活動

onCreate(){ 
    GlobalReference.activityRef = this; 
} 


finish(){ 
    GlobalReference.activityRef = null; 
} 

在你的後臺服務

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

希望這個代碼將解決您的問題。 快樂編碼...

相關問題