停止后台服务当应用程序进入后台时

时间:2014-10-18 10:42:10

标签: android background-service

我在我的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,然后将服务响应存储在数据库中。

4 个答案:

答案 0 :(得分:6)

在onPause()和onStop()

中停止服务
mContext.stopService(new Intent(mContext,
                     MyBackgroundService.class))

答案 1 :(得分:1)

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

以上代码将继续检查用户是否按下了主页按钮。

答案 2 :(得分:1)

当我们打开其他应用程序时,我们的应用程序(在后台)从内存中清除但是整个应用程序没有被删除但是一些不需要的数据和活动已经完成。 在您的情况下,当尝试更新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
}

希望此代码能解决您的问题。 快乐的编码...

答案 3 :(得分:0)

按Home键导致OnPause()函数。覆盖onPause()并调用stopService: mContext.stopService(new Intent(mContext,                      MyBackgroundService.class))