如何在不发送savedInstanceState的情况下启动新的Android活动?
我是一名新的Android开发者,在开始一项提供项目列表细节的新活动时遇到了一个问题 我的第一个活动是列出智能手机上安装的所有应用程序。 当我单击此列表中的某个项目时,第二个活动开始显示该项目的详细信息 然而,我的onSaveInstanceState方法(允许我在每次切换智能手机位置时不重新加载应用程序)似乎被发送到detail活动,并进入无限循环(或者非常长,因为ByteBuffer中的位图序列化) My PInfo对象是包含所有应用程序信息(版本、名称、位图)的对象 我的列表活动:如何在不发送savedInstanceState的情况下启动新的Android活动?,android,serialization,android-activity,bitmap,bytebuffer,Android,Serialization,Android Activity,Bitmap,Bytebuffer,我是一名新的Android开发者,在开始一项提供项目列表细节的新活动时遇到了一个问题 我的第一个活动是列出智能手机上安装的所有应用程序。 当我单击此列表中的某个项目时,第二个活动开始显示该项目的详细信息 然而,我的onSaveInstanceState方法(允许我在每次切换智能手机位置时不重新加载应用程序)似乎被发送到detail活动,并进入无限循环(或者非常长,因为ByteBuffer中的位图序列化) My PInfo对象是包含所有应用程序信息(版本、名称、位图)的对象 我的列表活动: @Ov
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_application_list);
if (savedInstanceState != null) {
apps = (ArrayList<PInfo>) savedInstanceState.getSerializable("apps");
} else {
apps = new ArrayList<PInfo>();
apps = getInstalledApps(false);
}
appAdapter = new AppAdapter(apps);
setListAdapter(appAdapter);
}
@Override
protected void onListItemClick(ListView l, View v, int position, long index) {
AppAdapter appAdapter = new AppAdapter(apps);
PInfo app = appAdapter.getItem(position);
Intent intent = new Intent(ApplicationListActivity.this,ApplicationDetailActivity.class);
//intent.putExtra("app", app);
intent.putExtra("app_index", index);
startActivity(intent);
}
private ArrayList<PInfo> getInstalledApps(boolean getSysPackages) {
ArrayList<PInfo> res = new ArrayList<PInfo>();
List<PackageInfo> packs = getPackageManager().getInstalledPackages(0);
for(int i=0;i<packs.size();i++) {
PackageInfo p = packs.get(i);
if ((!getSysPackages) && (p.versionName == null)) {
continue ;
}
PInfo newInfo = new PInfo();
newInfo.setAppname(p.applicationInfo.loadLabel(getPackageManager()).toString());
newInfo.setPname(p.packageName);
newInfo.setVersionName(p.versionName);
newInfo.setVersionCode(p.versionCode);
Drawable d = p.applicationInfo.loadIcon(getPackageManager());
Bitmap bitmap = ((BitmapDrawable)d).getBitmap();
newInfo.setIcon(bitmap);
res.add(newInfo);
}
return res;
}
@Override
protected void onSaveInstanceState(Bundle outState) {
outState.putSerializable("apps", apps);
super.onSaveInstanceState(outState);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_application_detail);
//PInfo p = (PInfo)getIntent().getExtras().getSerializable("app");
PackageInfo p = getPackageManager().getInstalledPackages(0).get((int)getIntent().getExtras().getLong("app_index"));
appName = (TextView) findViewById(R.id.appName);
versionName = (TextView) findViewById(R.id.versionName);
detailIcon = (ImageView) findViewById(R.id.detailIcon);
appName.setText(p.applicationInfo.loadLabel(getPackageManager()).toString());
versionName.setText(p.versionName);
detailIcon.setImageDrawable(p.applicationInfo.loadIcon(getPackageManager()));
}
来自logCat的部分消息(只是无限循环的一部分;):
10-31 15:06:53.065:D/dalvikvm(3406):GC_并发释放0公里,20%释放45150K/55751K,暂停12毫秒+8毫秒,总计32毫秒
10-31 15:06:53.065:D/dalvikvm(3406):等待并发GC阻塞20ms
10-31 15:06:53.100:D/dalvikvm(3406):GC_并发释放1013K,18%释放46177K/55751K,暂停12ms+3ms,总计33ms
10-31 15:06:53.100:D/dalvikvm(3406):等待并发GC阻塞21ms
10-31 15:06:53.115:D/dalvikvm(3406):所有释放的0公里,18%释放的46177K/55751K,暂停13毫秒,总计13毫秒
10-31 15:06:53.115:I/dalvikvm堆(3406):对于2105798字节分配,将堆(frag案例)增长到47.644MB
10-31 15:06:53.145:D/dalvikvm(3406):GC_并发释放1027K,16%释放47206K/55751K,暂停12ms+3ms,总计30ms
10-31 15:06:53.145:D/dalvikvm(3406):等待并发GC阻塞16毫秒
10-31 15:06:53.160:D/dalvikvm(3406):所有释放的0公里,16%释放的47206K/55751K,暂停15秒,总计15秒
10-31 15:06:53.165:I/dalvikvm堆(3406):为4213190字节分配将堆(frag大小写)增长到50.659MB
10-31 15:06:53.195:D/dalvikvm(3406):GC_并发释放6664K,20%释放44656K/55751K,暂停12ms+3ms,总计32ms
10-31 15:06:53.195:D/dalvikvm(3406):等待并发GC阻塞19ms
我希望我已经说得够清楚了,为可能出现的拼写错误感到抱歉。最后,是我的readObject和writeObject不适合位图的序列化。我找到了另一种方法,但存在一些性能问题(返回列表需要4或5秒):
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_application_detail);
//PInfo p = (PInfo)getIntent().getExtras().getSerializable("app");
PackageInfo p = getPackageManager().getInstalledPackages(0).get((int)getIntent().getExtras().getLong("app_index"));
appName = (TextView) findViewById(R.id.appName);
versionName = (TextView) findViewById(R.id.versionName);
detailIcon = (ImageView) findViewById(R.id.detailIcon);
appName.setText(p.applicationInfo.loadLabel(getPackageManager()).toString());
versionName.setText(p.versionName);
detailIcon.setImageDrawable(p.applicationInfo.loadIcon(getPackageManager()));
}