Android - Почему мое приложение использует около 40 МБ кэшированный фоновый процесс?

Я запускаю новое приложение с minSdkVersion = "14" и targetSdkVersion = "17". Он содержит просмотрщик с 6 страницами. Существует 3 просмотра веб-страниц и 3 других.

Когда я нажимаю свое приложение на задний план, нажимая на кнопку "Назад" или "Дом", он использует около 40 МБ в "кэшированном фоновом процессе", и я не понимаю, почему.

Это пример одного из моих веб-просмотров:

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.RelativeLayout;

public class Presentation extends Fragment {
    boolean isOption = false;
    RelativeLayout main = null;
    WebView web_main = null;

    public Presentation () {

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        main = (RelativeLayout) inflater.inflate(R.layout.webview,  container, false);
        return main;

    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onActivityCreated(savedInstanceState);
        web_main = new WebView(getActivity().getApplicationContext());
        web_main.setWebViewClient(new WebViewClient());
        web_main.getSettings().setAppCacheEnabled(false);
        web_main.loadUrl("file:///android_asset/main.html");
        main.removeAllViews();
        main.addView(web_main);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.i(getClass().getName(), "[OnDestroy]");
        main.removeAllViews();
        web_main.destroy();
        main = null;
        web_main = null;
        System.gc();
    }

}

Я следил за несколькими учебными пособиями и ответами, но никаких эффектов на кешированный фоновый процесс Это моя основная деятельность:

public class AppTest extends FragmentActivity {

/**
 * The {@link android.support.v4.view.PagerAdapter} that will provide
 * fragments for each of the sections. We use a
 * {@link android.support.v4.app.FragmentPagerAdapter} derivative, which
 * will keep every loaded fragment in memory. If this becomes too memory
 * intensive, it may be best to switch to a
 * {@link android.support.v4.app.FragmentStatePagerAdapter}.
 */
SectionsPagerAdapter mSectionsPagerAdapter;

/**
 * The {@link ViewPager} that will host the section contents.
 */
ViewPager mViewPager;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main_content);

    // Create the adapter that will return a fragment for each of the three
    // primary sections of the app.
    mSectionsPagerAdapter = new SectionsPagerAdapter(
            getSupportFragmentManager());

    // Set up the ViewPager with the sections adapter.
    mViewPager = (ViewPager) findViewById(R.id.pager);
    mViewPager.setAdapter(mSectionsPagerAdapter);

}

@Override
protected void onStop() {
    super.onStop();
    System.gc();
    Log.i(getClass().getName(), "[OnStop]");
    android.os.Debug.stopMethodTracing();

}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main_content, menu);
    return true;
}

@Override
protected void onDestroy() {
    super.onDestroy();
    mViewPager.removeAllViews();
    Log.i(getClass().getName(), "[OnDestroy]");
}

/**
 * A {@link FragmentPagerAdapter} that returns a fragment corresponding to
 * one of the sections/tabs/pages.
 */
public class SectionsPagerAdapter extends FragmentStatePagerAdapter {

    public SectionsPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        // getItem is called to instantiate the fragment for the given page.
        // Return a DummySectionFragment (defined as a static inner class
        // below) with the page number as its lone argument.
        Fragment fragment = null;

        switch (position) {
        case 0:
            fragment = new Presentation();
            break;
              /*    case 1:
            fragment = new Edition();
            break;
        case 2:
            fragment = new Programme();
            break;
        case 3:
            fragment = new Twitter();
            break;
        case 4:
            fragment = new Partenaire();
            break;
        case 5:
            fragment = new Information();
            break;*/
        default:
            fragment = new Presentation();
            break;
        }


        return fragment;
    }

    @Override
    public int getCount() {
        // Show 6 total pages.
        return 6;
    }

    @Override
    public CharSequence getPageTitle(int position) {

        switch (position) {
        case 0:
            return "Presentation";
        case 1:
            return "Edition";
        case 2:
            return "Program";
        case 3:
            return "Tweets";
        case 4:
            return "Partners";
        case 5:
            return "Information";
        }
        return null;
    }
}
}

Кто-нибудь может понять, что не так?

ИЗМЕНИТЬ Я попытался поместить webview в макет, но он все тот же На самом деле, я хочу знать, что помещается в кеш, когда приложение находится в фоновом состоянии?

Ответ 1

"Кэшированные фоновые процессы" обычно относятся к процессам, которые не имеют активности переднего плана и не имеют работающего сервиса. Эти процессы хранятся в памяти, потому что у нас достаточно памяти, и мы можем позволить пользователю быстро вернуться к ним. Если Android начнет работать из ОЗУ, эти процессы будут первыми, которые будут уничтожены, чтобы освободить ОЗУ. Иногда старый процесс приложения может храниться, когда одно и то же приложение переключается на новый процесс.

Насколько я могу судить, пространство, занимаемое в состоянии "кэшированного фонового процесса", будет определяться тем, что в настоящее время использует ваше приложение. Например, если приложение использует 20 МБ на переднем плане, тогда, если ОЗУ доступно, будет занято такое же пространство.

Если ваше приложение имеет 3 ImageViews и 3 WebViews, оно может очень хорошо занимать 40 МБ оперативной памяти в зависимости от того, что хранится в этих ImageViews и WebView. Вы можете использовать Инструменты профилирования, чтобы узнать, сколько памяти используется вашим приложением, и каковы они являются компонентами. Если память, используемая во время переднего плана, аналогична памяти в фоновом режиме, тогда все будет таким, как должно быть.

Примечание.. Производители могут использовать приложение настроек и переопределять, что подразумевается под "кэшированным фоновым процессом". В этом случае вам нужно будет связаться с ними, чтобы узнать, как именно они определяют его и в чем состоит.