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

时间:2014-08-07 16:33:35

标签: android android-activity

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

当我在模拟器中尝试并且几乎所有尝试过它的人都可以正常工作。

但是,现在有人发送了一封邮件,说明它无法在他的设备上运行(Galaxy):他可以在列表中选择并关闭它,但配置活动会再次打开它(就好像它没有收到所选的一样)结果)。会发生什么事?我需要用什么来让用户弄明白?

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是两个活动的singleTop

1 个答案:

答案 0 :(得分:1)

在某些设备上,由于内存不足或其他原因,当LibraryList完成时,AccountInfo可能会调用onCreate,在从onActivityResult获取结果后,您只在两个位置调用打开列表,而其他是来自OnCreate,因为你是确保onActivityResult始终获得结果

以下是您可以尝试的一些检查

  • 检查您是否正确使用startActivityForResult(),请勿使用startActivity()
  • 如果您在覆盖onBackPressed方法中执行某项操作,则super.onBackPressed();必须位于方法的最后一个位置,而不是第一行。 (我的情况是花5个小时)
  • 删除manifest或等效参数中的android:launchMode="singleInstance"以创建意图。
  • 删除被叫活动清单中的noHistory="true"
  • 检查错过setResult()
  • 调用
  • finish()来关闭活动。使用finishActivity()关闭被叫活动。
  • 使用requestCode大于零。负值不起作用。