Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/191.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在不发送savedInstanceState的情况下启动新的Android活动?_Android_Serialization_Android Activity_Bitmap_Bytebuffer - Fatal编程技术网

如何在不发送savedInstanceState的情况下启动新的Android活动?

如何在不发送savedInstanceState的情况下启动新的Android活动?,android,serialization,android-activity,bitmap,bytebuffer,Android,Serialization,Android Activity,Bitmap,Bytebuffer,我是一名新的Android开发者,在开始一项提供项目列表细节的新活动时遇到了一个问题 我的第一个活动是列出智能手机上安装的所有应用程序。 当我单击此列表中的某个项目时,第二个活动开始显示该项目的详细信息 然而,我的onSaveInstanceState方法(允许我在每次切换智能手机位置时不重新加载应用程序)似乎被发送到detail活动,并进入无限循环(或者非常长,因为ByteBuffer中的位图序列化) My PInfo对象是包含所有应用程序信息(版本、名称、位图)的对象 我的列表活动: @Ov

我是一名新的Android开发者,在开始一项提供项目列表细节的新活动时遇到了一个问题

我的第一个活动是列出智能手机上安装的所有应用程序。 当我单击此列表中的某个项目时,第二个活动开始显示该项目的详细信息

然而,我的onSaveInstanceState方法(允许我在每次切换智能手机位置时不重新加载应用程序)似乎被发送到detail活动,并进入无限循环(或者非常长,因为ByteBuffer中的位图序列化)

My PInfo对象是包含所有应用程序信息(版本、名称、位图)的对象

我的列表活动:

@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

  • 我想知道当我开始我的细节活动时发生了什么
  • 这个循环是否将所有应用程序中的所有位图序列化到ByteBuffer中
  • 如何在不启动此循环的情况下启动详细信息活动

  • 我希望我已经说得够清楚了,为可能出现的拼写错误感到抱歉。

    最后,是我的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()));
        
        
    }