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

Posted

技术标签:

【中文标题】当应用程序进入后台时如何停止可运行?【英文标题】:How to stop runnable when the app goes to background? 【发布时间】:2012-11-13 15:47:27 【问题描述】:

我正在尝试建立一个可以每 5 秒间隔加载广告的可运行文件(当然 5 秒太快了,这只是为了测试目的)

这是我的代码:

package com.admobsdk_dfp_handler;

import com.google.ads.*;
import com.google.ads.doubleclick.*;

import android.os.Bundle;
import android.os.Handler;
import android.app.Activity;
import android.view.Menu;
import android.widget.RelativeLayout;

public class AdMobSDK_DFP_Handler extends Activity 
    private DfpAdView adView;
    private Handler handler = new Handler();
    private Runnable runnable = new Runnable() 

        public void run() 
        adView.loadAd(new AdRequest());
        handler.postDelayed(this, 5000);
    
    ;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_ad_mob_sdk__dfp__handler);

        adView = new DfpAdView(
                this,
                AdSize.BANNER,
                AD_UNIT_ID);

        RelativeLayout layout = (RelativeLayout) findViewById(R.id.mainLayout);

        layout.addView(adView);

        adView.loadAd(new AdRequest());

        handler.postDelayed(runnable, 5000);


    ;

    @Override
    protected void onDestroy() 
        handler.removeCallbacks(runnable);
        super.onDestroy();
    


    @Override
    public boolean onCreateOptionsMenu(Menu menu) 
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_ad_mob_sdk__dfp__handler,
                menu);
        return true;
    


如果我按主页按钮将应用程序隐藏到后台,runnable 会以 5 秒的间隔继续加载广告。

当应用程序隐藏到后台时,是否有任何方法可以停止运行?非常感谢。

【问题讨论】:

【参考方案1】:

只需使用onPause()

当活动进入后台但尚未(尚未)被杀死时作为活动生命周期的一部分调用

@Override
protected void onPause() 
     handler.removeCallbacks(runnable);
     super.onPause();

可选

如果您想恢复该可运行文件。只需覆盖onResume() 回调

@Override
protected void onResume()

      handler.postDelayed(runnable, 5000);
      super.onResume();

同时删除onCreate()中的handler.postDelayed(runnable, 5000);

【讨论】:

顺便说一句,在 onCreate() 中删除 handler.postDelayed(runnable, 5000) 后应用程序运行良好,是不是因为当我打开应用程序时,方法 run() 会启动?这样我就不需要用 onCreate() 再次调用处理程序了? android系统调用onCreate()后,接下来是onStart(),然后是onResume()。你可以在这里看到它,developer.android.com/training/basics/activity-lifecycle/… 如果他转移到另一个活动怎么办?他在那里是怎么做到的?【参考方案2】:

onPause() 在应用程序进入后台时被调用。在 onPause() 中移除 runnable

protected void onPause() 
     handler.removeCallbacks(runnable);
     super.onPause();

【讨论】:

如果他转移到另一个活动怎么办?他在那里是怎么做到的? @tony9099,是一样的。在另一个活动进入前台之前,实际活动必须进入后台。 onPause() 将被调用。【参考方案3】:

onPause() onStop() 可以放在那里的函数handler.removeCallbacks(runnable);

您可以从这里获得更多信息Look at Activity life circle

【讨论】:

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

当应用程序在后台时如何停止位置服务?

当watchOS应用程序使用HKWorkoutSession在后台运行时如何使WCSession可访问

AVFoundation -AVCaptureSession 仅在进入后台并返回断点时停止并开始运行

当android应用程序后台运行时如何在android中隐藏视图(在后台运行时不停止android拍摄快照)[重复]

Android 进入后台时游戏也停止运行了,怎么破

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