Android application doesn't close after callin

2019-04-10 16:23发布

问题:

I have an Android app that worked great, before I've added admob activity. I'm closing my app with killing process (calling System.exit(0)). I know that this is the worst solution of finishing the app. I'm working with OpenGL states and libgdx framefork, so I can't fixed all memory leak that appear when I'm calling standard android finish() function.

So here's the problem:

My app works normally several times. I close and start it again and again. All works fine, but suddenly admob view doesn't appear and when I'm trying to close, it freezes. The sound works, last screen shows itself, but touching not working.

When I'm killing the process by task manager, the music still playing. Even when I completely remove the app, music still playing, so activity still working. It stops only when I reboot my phone.

Without admob all works fine. I also trying destroy adView before closing, without result.

Here is my main activity:

    public class ControllerActivity extends AndroidApplication{
    private  AdView adView;
    RelativeLayout layout;

    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        AndroidApplicationConfiguration cfg = new AndroidApplicationConfiguration();
        cfg.useGL20 = true;
        cfg.useCompass = false;
        cfg.useAccelerometer = false;

        layout = new RelativeLayout(this);

        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
                        WindowManager.LayoutParams.FLAG_FULLSCREEN);
        getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);

        View gameView = initializeForView(Controller.getInstance(), cfg);

        adView = new AdView(this, AdSize.BANNER, "MYID"); 

        AdRequest adRequest=new AdRequest();
        adView.loadAd(adRequest);

        layout.addView(gameView);

        RelativeLayout.LayoutParams adParams = 
                new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, 
                                RelativeLayout.LayoutParams.WRAP_CONTENT);
        adParams.addRule(RelativeLayout.ALIGN_PARENT_TOP);
        adParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);

        layout.addView(adView, adParams);

        setContentView(layout);
     }

        @Override
        public void onDestroy() {
        if (adView!=null) {
      adView.stopLoading();
          adView.destroy();
     }
        System.exit(0);
        super.onDestroy();
     }
 }

Have your any ideas, how to completely kill this process?

回答1:

I have found out some facts. If the application is terminated by System.exit(0) or by android.os.Process.killProcess the next time AdMob won't show ads. Even more if you try to terminate application it will stuck (the process remain active and the only option to kill it is the device reboot). The only solution is not to use System.exit(0) to exit application. It should be mentioned that it does not matter whether adView.destroy() or adView.stopLoading() was called.

I used this.moveTaskToBack(true); instead of termination. It will hide the application and if in some time it won't get restored Android will release all resources and AdMob will work OK. If the application will be restored it will continue from the same place.



回答2:

I continued testing and it seems that this is bug in the AdMob SDK 6.4.1. I have downloaded 6.3.0 and this bug has gone away.



回答3:

I usually use:

android.os.Process.killProcess(android.os.Process.myPid())

to kill the process and all activities that were started.

This is for a class that extends an Activity. I'm not totally sure if it differs from extending AndroidApplication



回答4:

Refer this i think it will work.

  <com.google.ads.AdView
             android:id="@+id/adView"
             android:layout_width="fill_parent"
             android:layout_height="wrap_content"
             android:layout_alignParentBottom="true"
             ads:adSize="SMART_BANNER"
             ads:adUnitId="@string/admobid"
             ads:loadAdOnCreate="true"
             ads:testDevices="TEST_EMULATOR, TEST_DEVICE_ID"
             android:background="@android:color/transparent" />

Or

You can call adView.stopLoading() on activity destroy.