Android学习,使用startActivityForResult时出现NullPointException异常,通过测试发现,onActivityResult在startActivityForResult启动其他Activity时就立刻被调用,而代码跟教程给出的实例代码是一致的,后来通过这篇文章总结:调用startActivityForResult,onActivityResult无响应的问题才找出问题的原因,原来是处在被启动的Activity的launchMode上。
// Activity A
btnSendParcelable.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(MainActivity.this, GetDataActivity.class);
User user = new User("cyfloel", 28, "male");
intent.putExtra(MainActivity.PARCELABLE_MESSAGE_NAME, user);
startActivityForResult(intent, 0);
}
});
// Activity B
protected void initView() {
tvDisplay = (TextView) findViewById(R.id.tvDisplay);
editText = (EditText) findViewById(R.id.editMessage);
btnSendBack = (Button) findViewById(R.id.btnSendBack);
btnSendBack.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent i = new Intent();
i.putExtra("BACK", editText.getText().toString());
setResult(1, i);
finish();
}
});
}
<activity
android:name=".GetDataActivity"
android:label="@string/title_activity_get_data"
android:parentActivityName=".MainActivity"
android:launchMode="singleTask" // 问题所在
android:theme="@style/AppTheme.NoActionBar"></activity>
Activity A执行startActivityForResult(intent, 0),没等到被调用的 Activity B执行onClick返回,回调函数onActivityResult() 就被执行了,这与 Activity 的加载模式(launchMode)有关。
原来在AndroidManifest.xml 中Activity B的launchMode设置为SingleTask时,则不需要Activity B返回,onActivityResult就会被执行,而改为standard(默认的模式),则能正常使用。
<activity
android:name=".GetDataActivity"
android:label="@string/title_activity_get_data"
android:parentActivityName=".MainActivity"
android:launchMode="standard" //设为标准模式即可正常使用
android:theme="@style/AppTheme.NoActionBar"></activity>
Note that this method should only be used with Intent protocols
* that are defined to return a result. In other protocols (such as
* {@link Intent#ACTION_MAIN} or {@link Intent#ACTION_VIEW}), you may
* not get the result when you expect. For example, if the activity you
* are launching uses the singleTask launch mode, it will not run in your
* task and thus you will immediately receive a cancel result.
在学习Android时,遇到startActivityForResult导致的NullPointException异常。问题源于onActivityResult在启动的Activity执行前就被调用。通过研究发现,此问题与被启动Activity在AndroidManifest.xml中的launchMode设置有关。当launchMode设为SingleTask时,onActivityResult会提前执行,改回standard模式则正常。
3532

被折叠的 条评论
为什么被折叠?



