在Android编程中,经常会有多个Activity之间、同Activity的旋转都要进行调用,数据传递的现象。如何理解Activity,确保正确的调用是每个Androider必须掌握的知识。
1:Activity旋转过程中通过Bundle实例进行数据读写,在onCreate(Bundle)读取、onSaveInstanceState(Bundle)写入。
例子:
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_quiz); //读取数据,并保存到类变量中 if (null != savedInstanceState) { mCurrentIndex = savedInstanceState.getInt(KEY_INDEX); mCheatersArray = savedInstanceState.getBooleanArray(USER_CHEAT_RECORD); } ***}protected void onSaveInstanceState(Bundle savedInstanceState) { super.onSaveInstanceState(savedInstanceState); //保存当前题目编号 savedInstanceState.putInt(KEY_INDEX, mCurrentIndex); //保存用户作弊记录 savedInstanceState.putBooleanArray(USER_CHEAT_RECORD, mCheatersArray); //保存两项数据,在onCreate方法中调用传递数据 }}
2:Activity之间的调用通过startActivity(Intent)只向子Activity传递数据,不会接收子Activity传回的数据;startActivityForResult(***)向子Activity传递数据,并通过onActivityResult(***)方法读取子Activity传回的数据。子Activity通过setResult(***)向父Activity传递数据。
//父Activity方法 //通过mCheatButton事件,创建子Activity实例,并传递数据 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); printLogInConsole(TAG, ONCREATE); setContentView(R.layout.activity_quiz); *** mCheatButton = (Button) findViewById(R.id.cheat_button); *** mCheatButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent i = new Intent(QuizActivity.this, CheatActivity.class); boolean answerIsTrue = mQuestionBank[mCurrentIndex].isTrueQuestion(); //传入所选问题索引、标准答案 i.putExtra(CheatActivity.EXTRA_ANSWER_IS_TRUE, answerIsTrue); i.putExtra(CheatActivity.EXTRA_ANSWER_INDEX, mCurrentIndex); //仅向子Activity传递数据 //startActivity(i); //向子Activity传递数据并获取返回数据 startActivityForResult(i, CheatActivity.CHEAT_REQUEST_CODE); } }); *** } //获取子Activity返回的数据 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { //是否对应的Activity返回 if (CheatActivity.CHEAT_REQUEST_CODE != requestCode) { return; } if (RESULT_OK != resultCode) { return; } if (null == data) { return; } mIsCheater = data.getBooleanExtra(CheatActivity.EXTRA_ANSWER_SHOWN, false); mCurrentIndex = data.getIntExtra(CheatActivity.EXTRA_ANSWER_INDEX, 0); //更新用户作弊信息 mCheatersArray[mCurrentIndex] = mIsCheater; } //子Activity //子Activity通过setResutl向父Activity传递数据 private void setAnswerShownResult(boolean isAnswerShown) { Intent data = new Intent(); data.putExtra(EXTRA_ANSWER_SHOWN, isAnswerShown); data.putExtra(EXTRA_ANSWER_INDEX, mCurrentIndex); setResult(RESULT_OK, data); }