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

12

我想建立一个可运行的程序,每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;
    }

}

如果我按下主页按钮将应用隐藏到后台,那么可运行程序将以每5秒的间隔继续加载广告。

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

3个回答

37

只需使用 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() 调用 handler 了吗? - Kit Ng
在 Android 系统调用 onCreate() 方法之后,接下来会调用 onStart() 方法,然后是 onResume() 方法。您可以在此处查看详细信息:http://developer.android.com/training/basics/activity-lifecycle/starting.html - user948620
1
如果他已经转移到另一个活动,他该怎么做呢?在那里他该怎么做? - tony9099

2

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

您可以从这里获取更多信息:查看Activity生命周期


0

当应用程序进入后台时,将调用onPause()。在onPause()中移除可运行项。

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

1
如果他已经转移到另一个活动,他该怎么在那里执行操作? - tony9099
1
@tony9099,没错。在另一个活动进入前台之前,当前活动必须转到后台。此时将调用onPause()方法。 - Lazy Ninja

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接