我正在使用minSdkVersion =“14”和targetSdkVersion =“17”开始一个新应用。它包含一个6页的viewpager。有3个网页浏览量和3个其他视图。
当我通过单击后退或主页按钮将我的应用程序推送到后台时,它在“缓存后台进程”中使用大约40MB,我不明白为什么。
这是我的一个webview示例:
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放在布局中,但它仍然是相同的 事实上,我想知道应用程序处于后台状态时缓存中的内容是什么?
答案 0 :(得分:5)
“缓存的后台进程”通常是指没有前台活动但没有正在运行的服务的进程。这些进程保存在内存中,因为我们有足够的内存,我们可以允许用户快速切换回它们。如果Android开始耗尽RAM,这些进程将首先被销毁以释放RAM。有时,当同一个应用切换到新流程时,可能会保留旧的应用流程。
据我所知,“缓存后台进程”状态中占用的空间将取决于您当前使用的应用程序。例如,如果应用程序在前台使用20MB,那么如果RAM可用,则将占用相同的空间量。
如果您的应用有3个ImageView和3个WebView,它可以很好地占用40MB的RAM空间,具体取决于存储在那些ImageView和WebView中的内容。您可以使用Profiling tools查看您的应用使用了多少内存以及它的组件。如果前景中使用的内存类似于处于后台状态的内存,那么一切都应该如此。
注意:制造商可能会破坏设置应用并重新定义“缓存后台进程”的含义。在这种情况下,您必须与他们联系,以了解他们如何定义它以及它由何种组成。