我正在使用Google Admob SDK v6.1.0(https://developers.google.com/mobile-ads-sdk/download),并以编程方式(不是以XML格式)实例化com.google.ads.AdView,并添加它在我的Activity中动态地变成LinearLayout.
我的一位用户报告说,当他们在我的Activity中点击Home按钮时(为了让它背景),他们开始看到来自我的应用程序的高CPU使用率.我能够在Jellybean平台上重现这一点,并注意到高CPU使用率的来源是WebViewCoreThread.
我的Activity根本不使用任何WebView,但我能够逐步完成Activity的初始化,并注意到当我实例化AdMob AdView对象时,此WebViewCoreThread会启动.作为AdMob引用中的状态,我在Activity的onDestroy()方法中调用此AdView上的destroy().我改变了我的代码,在我的onPause()方法中调用了AdView.onDestroy().但似乎没有任何因素导致WebViewCoreThread停止.我猜,如果那个线程坚持下去,我没关系.但是,如果我反复多次启动我的Activity,这个线程开始使用我的CPU的8%到25%之间的任何地方,即使我的活动不在前台.
我注意到其他一些用户说你必须调用WebView.onPause()作为纠正措施.(http://stackoverflow.com/questions/2040963/webview-threads-never-stop-webviewcorethread-cookiesyncmanager-http0-3)但这对我来说不是直接可行的,因为我的网页视图是由AdMob的AdView创建的.我还改变了我的代码,调用.removeAllViews()为mt Admob AdView的容器LinearLayout对象,然后调用System.gc()强制垃圾收集,但似乎什么都没有杀死我的WebViewCoreThread并最终开始吃掉CPU直到我强行 - 杀了我的应用程序.
AdMob为什么这样做的任何线索,以及我如何强制杀死这个线程?
我附加了一个我创建的类来封装AdView的创建和销毁.我在我的活动的初始化中调用了这个类的getNewAd()方法.我在Activity的onPause()和onDestroy()方法中调用了这个类的removeAd():
package com.shiprack.client;
import com.google.ads.AdRequest;
import com.google.ads.AdSize;
import com.google.ads.AdView;
import com.mobclix.android.sdk.Mobclix;
import com.mobclix.android.sdk.MobclixMMABannerXLAdView;
import android.app.Activity;
import android.view.Gravity;
import android.view.ViewGroup.LayoutParams;
import android.widget.LinearLayout;
public class AdManager {
public AdManager(EventLog logger, LinearLayout container, Activity activity) {
_container = container;
_activity = activity;
_eventLogger = logger;
}
public void setNetwork(int network) {
_network = network;
}
public void getNewAd() {
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT);
params.gravity = Gravity.CENTER;
switch (_network) { …Run Code Online (Sandbox Code Playgroud) 我已按照说明在此处设置Android GCM客户端应用程序,并且特别针对此摘录存在问题:
对于扩展WakefulBroadcastReceiver的现有应用程序,Google建议迁移到GCMReceiver和GcmListenerService.要迁移:在应用清单中,将GcmBroadcastReceiver替换为"com.google.android.gms.gcm.GcmReceiver",并将当前扩展IntentService的服务声明替换为新的GcmListenerService从客户端代码中删除BroadcastReceiver实现重构当前IntentService服务实现使用GcmListenerService
我在GCM实现中看到的大多数示例都使用了一个扩展的类WakefulBroadcastReceiver.比如这个.当您这样做时,您有机会使用NotificationManager和自定义通知图标,声音等.但是,如果您遵循Google的建议,我不确定如何自定义通知.大多数使用GcmListenerServiceGoogle建议的示例都会覆盖该onMessageReceived方法.但是,只有在收到通知时应用程序已经位于前台,或者用户单击通知本身时,才会调用该方法.该方法不是自定义通知声音的正确位置.在调用该方法之前已经播放了声音.
所以,如果我需要自定义通知声音,我应该覆盖一个不同的方法GcmListenerService,但是没有文档显示哪一个.另一种选择是使用此处sound描述的属性.但是你必须自己将声音文件捆绑在应用程序的目录中.这似乎是错的.我宁愿只使用系统提供的声音,主题等.res/raw
思考?