当前位置: 首页 > 知识库问答 >
问题:

如何在不发送SavedInstanceState的情况下开始一个新的Android活动?

杜弘伟
2023-03-14

我是一个新的Android开发者,我有一个问题,当我开始一个新的活动,提供一个项目列表的细节。

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

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

public class PInfo implements Serializable{

private static final long serialVersionUID = 1L;
private String appname = "";
private String pname = "";
private String versionName = "";
private int versionCode = 0;    
private Bitmap icon ;

private static ByteBuffer dst;
private static byte[] bytesar;

public String getAppname() {
    return appname;
}
public void setAppname(String appname) {
    this.appname = appname;
}
public String getPname() {
    return pname;
}
public void setPname(String pname) {
    this.pname = pname;
}
public String getVersionName() {
    return versionName;
}
public void setVersionName(String versionName) {
    this.versionName = versionName;
}
public int getVersionCode() {
    return versionCode;
}
public void setVersionCode(int versionCode) {
    this.versionCode = versionCode;
}
public Bitmap getIcon() {
    return icon;
}
public void setIcon(Bitmap icon) {
    this.icon = icon;
}
private void writeObject(ObjectOutputStream out) throws IOException{

    out.writeObject(appname);
    out.writeObject(pname);
    out.writeObject(versionName);
    out.writeInt(versionCode);


    out.writeInt(icon.getRowBytes());
    out.writeInt(icon.getHeight());
    out.writeInt(icon.getWidth());

    int bmSize = icon.getRowBytes() * icon.getHeight();
    if(dst==null || bmSize > dst.capacity())
        dst= ByteBuffer.allocate(bmSize);

    out.writeInt(dst.capacity());

    dst.position(0);

    icon.copyPixelsToBuffer(dst);
    if(bytesar==null || bmSize > bytesar.length)
        bytesar=new byte[bmSize];

    dst.position(0);
    dst.get(bytesar);


    out.write(bytesar, 0, bytesar.length);

}

private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException{

    appname=(String) in.readObject();

    pname=(String) in.readObject();
    versionName=(String) in.readObject();
    versionCode= in.readInt();


    int nbRowBytes=in.readInt();
    int height=in.readInt();
    int width=in.readInt();

    int bmSize=in.readInt();



    if(bytesar==null || bmSize > bytesar.length)
        bytesar= new byte[bmSize];


    int offset=0;

    while(in.available()>0){
        offset=offset + in.read(bytesar, offset, in.available());
    }


    if(dst==null || bmSize > dst.capacity())
        dst= ByteBuffer.allocate(bmSize);
    dst.position(0);
    dst.put(bytesar);
    dst.position(0);
    icon=Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
    icon.copyPixelsFromBuffer(dst);
    //in.close();
}

我的列表活动:

@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()));
    
    
}

10-31 15:06:53.065:D/DalvikVM(3406):WAIT_FOR_CONCURRENT_GC阻塞20ms

10-31 15:06:53.100:D/DalvikVM(3406):GC_CONCURRENT释放1013K,18%释放46177K/55751K,暂停12ms+3ms,总计33ms

10-31 15:06:53.100:D/DalvikVM(3406):WAIT_FOR_CONCURRENT_GC阻塞21ms

10-31 15:06:53.115:D/DalvikVM(3406):GC_FOR_ALLOC释放0K,18%释放46177K/55751K,暂停13ms,总计13ms

10-31 15:06:53.115:I/dalvikvm-heap(3406):将堆(frag大小写)增长到47.644MB,用于2105798字节分配

10-31 15:06:53.145:D/DalvikVM(3406):GC_CONCURRENT释放1027K,16%释放47206K/55751K,暂停12ms+3ms,总计30ms

10-31 15:06:53.145:D/DalvikVM(3406):WAIT_FOR_CONCURRENT_GC阻塞16ms

10-31 15:06:53.160:D/DalvikVM(3406):GC_FOR_ALLOC释放0K,16%释放47206K/55751K,暂停15ms,总计15ms

10-31 15:06:53.165:I/dalvikvm-heap(3406):将堆(frag大小写)增长到50.659MB,用于4213190字节分配

10-31 15:06:53.195:D/DalvikVM(3406):GC_CONCURRENT释放6664K,20%释放44656K/55751K,暂停12ms+3ms,总计32ms

10-31 15:06:53.195:D/DalvikVM(3406):WAIT_FOR_CONCURRENT_GC阻塞19ms

  1. 我想知道启动详细信息活动时发生了什么?
  2. 此循环是否将来自所有应用程序的所有位图序列化到ByteBuffer中?
  3. 不启动此循环,如何启动详细信息活动?

我希望我已经足够清楚了,抱歉,可能的拼写错误。

共有1个答案

云伯寅
2023-03-14

最后,是我的readObject和writeObject不适合位图的序列化。我找到了另一种方法,但存在一些性能问题(返回列表需要4或5秒):在Java中序列化和反序列化android.graphics.bitmap

 类似资料:
  • 我正在建立一个应用程序,用户将把他们的测试和作业和任何东西。我想知道我的应用程序是否有可能在测试前一周和一天发出通知? 我看到的到处都是firebase通知和push通知。 我不想要这些在线通知,我将需要应用程序发送他们自己离线。这可能吗?

  • 问题内容: 我已经使用提交按钮在ajax中发送了数据,而没有刷新任何页面。但是页面刷新了。 请检查我的代码,让我知道问题所在。 ajax.php 问题答案: js已经阻止了表单提交 问题中的代码 已经 阻止了此行提交表单: 这意味着:问题中的JavaScript代码根本没有运行。 该表格尚不存在 这里的问题是当此行代码运行时: 那个元素还没有加入dom 。因此,提交处理程序不附加任何内容-表单提交

  • 我正在基于Tomcat servlet和NIO创建服务。输入时有大的XML请求(约100 MB),通过HTML POST方法发送。我只想流前8千磅,然后立即发送响应到客户端。 当我尝试发送小请求(内容中只有几行)时,套接字工作正常。 2016-02-01 10:44:52 Http11NioProtocol[DEBUG]套接字:[org.apache.tomcat.util.net.NioEndp

  • 到目前为止,我运行的是一台视窗8.1电脑,它没有像Android Studio或Eclipse这样的IDE的存储或内存。我想下载Android SDK工具,没有IDE。如何才能做到这一点?

  • 我使应用程序有两个活动。 2 ExitText(登录名和密码) 第二个: 2 TextView(获取登录名和密码与共享首选项); 按钮(清除共享首选项上的数据,意图优先活动)。 如何下一步:当SharedReferences上有一些数据时-应用程序将从第二个屏幕启动。 例如,我提出: if(用户!=null 但是,从技术上讲,它首先运行第一个活动,然后再运行第二个活动。若有一些方法可以用另一个活动

  • 我正在开发一个应用程序,该应用程序收集用户选择(从复选框中)并将其发送到一个新活动(当按下按钮时)。在新活动中,将收集一个新数据(editText)并将新收集的接收数据合并并通过电子邮件发送。 当我按下第一个按钮将复选框数据发送到新活动时,我得到一个错误: 应用程序意外停止 下面是代码: 复选框转换方法为: 所以,如果有任何错误,请告诉我。