当应用程序进入后台时如何停止可运行?
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 仅在进入后台并返回断点时停止并开始运行