停止后台服务当应用程序转到后台

问题描述:

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

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

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

按Home键事业的onPause()函数。覆盖的onPause()并调用stopService: mContext.stopService(新意图(mContext, MyBackgroundService.class))

+0

请检查更新的问题。因为我已经尝试了您的代码,但仍然应用程序崩溃,而应用程序在后台和其他应用程序正在运行。 – Ravi 2014-10-18 12:17:27

@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

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

希望这个代码将解决您的问题。 快乐编码...