在onCreate中启动活动并获得结果



我有一个应用程序,在初始启动时打开配置活动,该配置活动打开一个列表活动(startActivityForResult in onCreate)。在列表活动中,用户可以选择一个值,该值关闭列表并将该值发送给配置活动(setResult、finish、onActivityResult)。

当我在模拟器中尝试它时,它工作得很好,几乎所有尝试过它的人。

然而,现在有人发送了一封邮件,它不工作在他的设备(银河):他可以选择列表中的东西并关闭它,但配置活动再次打开它(好像它没有收到选择的结果)。会发生什么呢?我需要问用户什么才能弄明白?

public class AccountInfo extends VideLibriBaseActivity /* extends SherlockActivity */ {
   void openList(){ //called in onCreate and on cancel
        findViewById(R.id.libraryTextView).postDelayed(new Runnable() {
            @Override
            public void run() {
                Intent intent = new Intent(AccountInfo.this, LibraryList.class);
                //...
                startActivityForResult(intent, REQUEST_LIBRARY_FOR_ACCOUNT_CREATION);
            }
        }, 200); //did not work without delay on some devices
    }
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == REQUEST_LIBRARY_FOR_ACCOUNT_CREATION) {
            if (resultCode == LibraryList.RESULT_OK) {
                libId = data.getStringExtra("libId");
                libName = data.getStringExtra("libName");
                lib.setText(libName);
                //...
            } else if (libId.equals(""))
                if (mode == MODE_ACCOUNT_CREATION_INITIAL && (VideLibriApp.accounts.length == 0))
                    openList();
                else
                    finish();
        }
    }        
}
public class LibraryList extends VideLibriBaseActivity /* extends SherlockActivity */  {
  //...
  lv.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
        @Override
        public boolean onChildClick(ExpandableListView expandableListView, View view, int i, int i2, long l) {
            Intent result = new Intent();
            result.putExtra("libName", localLibs.get(i).get(i2).get("NAME"));
            result.putExtra("libId", localLibs.get(i).get(i2).get("ID"));
            //...
            setResult(RESULT_OK, result);
            LibraryList.this.finish();
            return true;
        }
    });
    //...
}

launchMode is singleTop for both activities

它看起来像在一些设备上由于低内存或其他原因AccountInfo可能会调用onCreate当LibraryList完成时,你从onActivityResult和其他onCreate中获得结果后,只在两个地方召回打开列表,因为你确信onActivityResult将始终获得结果

这里有一些你可以试穿的检查

  • 检查startActivityForResult()是否正确使用,不要使用startActivity()
  • 如果您在覆盖onBackPressed方法中做一些事情,super.onBackPressed();必须定位在方法的最后,而不是在第一行。(我的案例花了5个小时)
  • 删除manifest中的android:launchMode="singleInstance"或等效参数以创建意图。
  • 删除被调用者活动清单中的noHistory="true"
  • 检查setResult()缺失
  • 调用
  • finish()来关闭活动。使用finishActivity()关闭被调用者活动。
  • 使用requestCode大于零。负值不行。

最新更新