Sto utilizzando AdMob nella mia app. Ho seguito le linee guida di implementazione e il banner mostra e carica correttamente gli annunci. My MainActivity è responsabile della creazione di riferimenti, della creazione di AdRequest e della visualizzazione del banner, nonché della pausa, della ripresa e della distruzione di AdView. Ogni volta che l'AdRequest è stata caricata, quando viene chiamata la propria attività onStop(), viene creata la seguente eccezione:AdMob: "l'attività ha interrotto ServiceConnection" e "AdvertisingIdClient unbindService non è riuscito."
6706-6706/com.rocca.controlloSpese E/ActivityThread﹕ Activity com.rocca.controlloSpese.MainActivity has leaked ServiceConnection [email protected] that was originally bound here
android.app.ServiceConnectionLeaked: Activity com.rocca.controlloSpese.MainActivity has leaked ServiceConnection [email protected] that was originally bound here
at android.app.LoadedApk$ServiceDispatcher.<init>(LoadedApk.java:970)
at android.app.LoadedApk.getServiceDispatcher(LoadedApk.java:864)
at android.app.ContextImpl.bindServiceCommon(ContextImpl.java:1577)
at android.app.ContextImpl.bindService(ContextImpl.java:1560)
at android.content.ContextWrapper.bindService(ContextWrapper.java:517)
at com.google.android.gms.ads.identifier.a.b(SourceFile:330)
at com.google.android.gms.ads.identifier.a.a(SourceFile:187)
at com.google.android.gms.ads.identifier.a.b(SourceFile:239)
at com.google.android.a.t.f(SourceFile:132)
at com.google.android.a.t.b(SourceFile:182)
at com.google.android.a.q.a(SourceFile:258)
at com.google.android.a.q.a(SourceFile:195)
at com.google.android.gms.ads.internal.m.a(SourceFile:107)
at com.google.android.gms.ads.internal.request.c.a(SourceFile:99)
at com.google.android.gms.ads.internal.util.b.run(SourceFile:17)
at com.google.android.gms.ads.internal.util.d.call(SourceFile:29)
at com.google.android.gms.ads.internal.util.e.call(SourceFile:49)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:841)
seguito da queste informazioni:
6706-6781/com.rocca.controlloSpese I/AdvertisingIdClient﹕ AdvertisingIdClient unbindService failed.
java.lang.IllegalArgumentException: Service not registered: [email protected]
at android.app.LoadedApk.forgetServiceDispatcher(LoadedApk.java:922)
at android.app.ContextImpl.unbindService(ContextImpl.java:1611)
at android.content.ContextWrapper.unbindService(ContextWrapper.java:529)
at com.google.android.gms.ads.identifier.a.c(SourceFile:275)
at com.google.android.gms.ads.identifier.b.c(SourceFile:100)
at com.google.android.gms.ads.identifier.b.run(SourceFile:110)
questo non avviene se l'AdRequest è non costruito e caricato. Ho impostato il mio IABHelper in onCreate() e, se l'utente non ha acquistato il mio sku "rimuovere gli annunci", vengono mostrati gli annunci. Questo è il codice che uso per caricare gli annunci:
private void showAds() {
int adresult = GooglePlayServicesUtil.isGooglePlayServicesAvailable(MainActivity.this);
if (adresult == ConnectionResult.SUCCESS) {
//if possible, show ads
AdRequest adRequest = new AdRequest.Builder()
.addTestDevice(AdRequest.DEVICE_ID_EMULATOR)
.addTestDevice("C144E9DA02EA7B26F74ED2C231F31D38")
.addTestDevice("93BABD84466B8C1EF529D2FB39D1ACE8")
.addTestDevice("BEAA738068664AE9BBF673E37A782E03")
.addTestDevice("E51508081F77DF84C129EE471DE67141")
.build();
adView.setVisibility(View.VISIBLE);
adView.loadAd(adRequest);
} else {
//if there's a problem, show error and close app
GooglePlayServicesUtil.getErrorDialog(adresult, MainActivity.this, 0, new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialogInterface) {
finish();
}
}).show();
}
}
di pause()
, resume()
e destroy()
sono chiamati nei metodi del rispettivo attività ADView. In pratica, le prestazioni dell'app non sono influenzate, ma preferirei evitare perdite di memoria. Come evitare questa eccezione?
EDIT: il manifest.XML
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.rocca.controlloSpese" >
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="com.android.vending.BILLING" />
<uses-permission android:name="com.rocca.controlloSpese.BROADCAST_PERMISSION" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:finishOnCloseSystemDialogs="true"
android:label="@string/app_name"
android:launchMode="singleTop" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />
<activity
android:name="com.google.android.gms.ads.AdActivity"
android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize" />
</application>
puoi inserire qui il file manifest? –
certo, ho tagliato altre dichiarazioni per renderlo breve e chiaro. Solo MainActivity carica gli annunci. – devrocca
fai qualcosa di speciale nel metodo onStop()? – Michael