簡體   English   中英

停止后台服務當應用程序進入后台時

[英]Stop background Service When application goes to background

我在我的Android應用程序中有后台服務,我從MainActivity onResume()方法啟動服務,它工作正常。但是當用戶按下主頁按鈕時如何停止服務。因為當前用戶按下主頁按鈕然后應用程序移動到后台然后用戶打開一些其他應用程序然后一段時間后調用我的服務方法和app強制停止.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();
}

但我的服務是運行,而我使用其他應用程序,它強制停止app.From后台服務我調用一些webservice,然后將服務響應存儲在數據庫中。

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

mContext.stopService(new Intent(mContext,
                     MyBackgroundService.class))
@Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if(keyCode==KeyEvent.KEYCODE_HOME){
            Log.e("home key pressed", "****");   
            // write your code here to stop the activity
            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();      
    }

以上代碼將檢查用戶是否按下了主頁按鈕。

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

所以請在onCreate()中保存activty的參考(其UI將被更新),並在finish()方法中將引用設置為null,然后在后台服務中檢查此引用,如果它不為null,則更新UI,否則不更新用。

// 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
}

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

按Home鍵導致OnPause()功能。 覆蓋onPause()並調用stopService:mContext.stopService(new Intent(mContext,MyBackgroundService.class))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM