如何在Android上pipe理`startActivityForResult`?
在我的活动中,我通过startActivityForResult
从主要活动中调用第二个活动。 在我的第二个活动中,有一些方法可以完成这个活动(也许没有结果),但是,只有其中一个返回结果。
例如,从主要活动中,我称之为第二个活动。 在这个活动中,我正在检查手机的一些function,如它是否有相机。 如果没有,我会closures这个活动。 此外,在准备MediaRecorder
或MediaPlayer
如果发生问题,我将closures此活动。
如果它的设备有一个摄像头,录制完成,那么录制完video后,如果用户点击完成button,我会把结果(录制的video的地址)发回主要活动。
我如何检查主要活动的结果?
从SecondActivity
使用startActivityForResult()
方法调用SecondActivity
例如:
Intent i = new Intent(this, SecondActivity.class); startActivityForResult(i, 1);
在你的SecondActivity
设置你想要返回到FirstActivity
。 如果你不想返回,不要设置任何。
例如:在secondActivity中如果你想发回数据:
Intent returnIntent = new Intent(); returnIntent.putExtra("result",result); setResult(Activity.RESULT_OK,returnIntent); finish();
如果你不想返回数据:
Intent returnIntent = new Intent(); setResult(Activity.RESULT_CANCELED, returnIntent); finish();
现在在你的FirstActivity类中为onActivityResult()
方法写下面的代码。
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == 1) { if(resultCode == Activity.RESULT_OK){ String result=data.getStringExtra("result"); } if (resultCode == Activity.RESULT_CANCELED) { //Write your code if there's no result } } }//onActivityResult
如何检查主要活动的结果?
你需要重写Activity.onActivityResult()
然后检查它的参数:
-
requestCode
标识哪个应用程序返回这些结果。 这是您在调用startActivityForResult()
时定义的。 -
resultCode
通知您这个应用程序是否成功,失败或不同 -
data
保存这个应用程序返回的任何信息。 这可能是null
。
补充@ Nishant的答案,返回活动结果的最佳方式是:
Intent returnIntent = getIntent(); returnIntent.putExtra("result",result); setResult(RESULT_OK,returnIntent); finish();
我遇到了问题
new Intent();
然后我发现正确的方法正在使用
getIntent();
得到目前的意图
例
为了在上下文中看到整个过程,这里是一个补充答案。 看到我更全面的答案更多的解释。
MainActivity.java
public class MainActivity extends AppCompatActivity { // Add a different request code for every activity you are starting from here private static final int SECOND_ACTIVITY_RESULT_CODE = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } // "Go to Second Activity" button click public void onButtonClick(View view) { // Start the SecondActivity Intent intent = new Intent(this, SecondActivity.class); startActivityForResult(intent, SECOND_ACTIVITY_RESULT_CODE); } // This method is called when the second activity finishes @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); // check that it is the SecondActivity with an OK result if (requestCode == SECOND_ACTIVITY_RESULT_CODE) { if (resultCode == RESULT_OK) { // Activity.RESULT_OK // get String data from Intent String returnString = data.getStringExtra("keyName"); // set text view with string TextView textView = (TextView) findViewById(R.id.textView); textView.setText(returnString); } } } }
SecondActivity.java
public class SecondActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); } // "Send text back" button click public void onButtonClick(View view) { // get the text from the EditText EditText editText = (EditText) findViewById(R.id.editText); String stringToPassBack = editText.getText().toString(); // put the String to pass back into an Intent and close this activity Intent intent = new Intent(); intent.putExtra("keyName", stringToPassBack); setResult(RESULT_OK, intent); finish(); } }
如果要用活动结果更新用户界面,则不能使用this.runOnUiThread(new Runnable() {}
执行此操作时,UI将不会刷新,而是可以执行此操作:
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == RESULT_CANCELED) { return; } global_lat = data.getDoubleExtra("LATITUDE", 0); global_lng = data.getDoubleExtra("LONGITUDE", 0); new_latlng = true; } @Override protected void onResume() { super.onResume(); if(new_latlng) { PhysicalTagProperties.this.setLocation(global_lat, global_lng); new_latlng=false; } }
这似乎很愚蠢,但工作得很好。
对于那些在onActivityResult中有错误requestCode的问题
如果从Fragment
调用startActivityForResult()
,则requestCode由拥有Fragment的Activity改变。
如果你想在你的活动中得到正确的resultCode,试试这个:
更改:
startActivityForResult(intent, 1);
至:
getActivity().startActivityForResult(intent, 1);
首先在第一个Activity
使用startActivityForResult()
,如果要从第二个Activity
将数据发送到第一个Activity
则使用Intent
和setResult()
方法传递值,并在第一个Activity
onActivityResult()
方法中获取数据。
- 错误:“Adb连接错误:现有连接被远程主机强制closures”
- 在命令行上使用Gradle生成一个android studio项目失败:Xlint错误
- Android碎片和animation
- Android – WebView语言在Android N上突然更改
- Eclipse Android插件中的“debugging证书过期”错误
- 如何获取Android设备的CURRENT方向(ActivityInfo.SCREEN_ORIENTATION_ *)?
- 如何在Android中自定义共享意图?
- Eclipse中的多个标签的Android LogCatfilter
- Facebook Android SDK的关键哈希