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

Posted

技术标签:

【中文标题】当应用程序进入后台时停止后台服务【英文标题】:Stop background Service When application goes to background 【发布时间】:2014-12-13 20:31:31 【问题描述】:

我的 android 应用程序中有后台服务,我从 MainActivity onResume() 方法启动服务并且它工作正常。但是当用户按下主页按钮时我如何停止服务。因为当前当用户按下主页按钮时应用程序移动到背景,然后用户打开其他应用程序,然后在一段时间后调用我的服务方法并强制停止应用程序。下面是我的启动服务代码 -

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

提前致谢。

已编辑

在我的服务中,我使用以下代码 -

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

【参考方案2】:
@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();      
    

上面的代码会一直检查用户是否按下了home键。

【讨论】:

我已经尝试过你的代码,但是当按下主页按钮时,不会调用 onKeyDown 方法。 您必须从后台服务更新 ui,这可能会导致崩溃。如果是这样,您需要对活动的上下文进行检查,并在 onPause 和 Onkey down 方法上使其为空,然后在更新 ui 之前对其进行检查。【参考方案3】:

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

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

【讨论】:

【参考方案4】:

按下 Home 按钮会导致 OnPause() 函数。覆盖 onPause() 并调用 stopService: mContext.stopService(新意图(mContext, MyBackgroundService.class))

【讨论】:

请检查更新的问题。因为我已经尝试了您的代码,但是当应用程序在后台并且其他一些应用程序正在运行时,应用程序仍然崩溃。

以上是关于当应用程序进入后台时停止后台服务的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS 上,当应用程序进入后台时 UnityWebRequest 下载停止

当手机进入空闲状态时后台服务停止

当应用程序进入后台时,MediaBrowserServiceCompat 停止播放音乐

当应用程序进入后台时停止 AVAudioPlayer 音乐

当应用程序进入后台时如何停止可运行?

当应用程序从堆栈中被杀死时,后台服务停止