OnActivityResult() 和 OnNewResult() 有什么区别?
What is difference between OnActivityResult() and OnNewResult()?
Please look at this photo
我想让应用程序看起来像那张照片..
当我点击 sub-activities 上的 MainActivity 按钮时,
OnActivityResult() 和 OnNewIntent() 都在 MainActicity 中调用。
我打算调用 OnActivityResult() 从 MenuActivity 返回,
并调用 OnNewIntent() 从 subs 返回。
我了解到妈妈activity通过StartActivityForResult()调用childactivity,
child 为 return 调用 setResult()。
而当我要调用的 objective activity 还活着的时候,
我了解到需要 onNewContent() 因为 objective activity 不调用 onCrete()。
但我想我错了。请让我知道 OnActivityResult() 和 OnNewResult() 有什么区别?
而且我还想知道为什么即使在 setResult() 中没有调用 setResult 也会调用 OnActivityResult。
提前致谢。
MainActivity.java
public class MainActivity extends AppCompatActivity {
EditText editText;
EditText editText2;
public static final int REQUEST_CODE_MENU = 100;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editText = (EditText) findViewById(R.id.editText);
editText2 = (EditText) findViewById(R.id.editText2);
Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(editText.getText().toString().length() != 0 &&
editText2.getText().toString().length() != 0){
Intent intent = new Intent(getApplicationContext(), MenuActivity.class);
startActivityForResult(intent, REQUEST_CODE_MENU);
} else {
Toast.makeText(getApplicationContext(),"ID와 비밀번호를 입력해주세요.", Toast.LENGTH_LONG).show();
}
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE_MENU) {
if (resultCode == RESULT_OK) {
Toast.makeText(getApplicationContext(), "MenuActivity에서 온 Intent입니다.", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(getApplicationContext(), "ERROR : The value of resultCode is not RESULT_OK", Toast.LENGTH_LONG).show();
}
} else if {
Toast.makeText(getApplicationContext(), "ERROR : The value of requestCode is not REQUEST_CODE_MENU (100)", Toast.LENGTH_LONG).show();
}
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
Toast.makeText(getApplicationContext(), intent.getStringExtra("from") + "에서 온 Intent입니다.", Toast.LENGTH_LONG).show();
}
}
MenuActivity.java
public class MenuActivity extends AppCompatActivity {
public static final int REQUEST_CODE_CUSTOM = 200;
public static final int REQUEST_CODE_REVENUE = 300;
public static final int REQUEST_CODE_PRODUCT = 400;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_menu);
Button custom = (Button) findViewById(R.id.custom);
custom.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent_cus = new Intent(getApplicationContext(), CustomActivity.class);
startActivityForResult(intent_cus, REQUEST_CODE_CUSTOM);
}
});
Button revenue = (Button) findViewById(R.id.revenue);
revenue.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent_rev = new Intent(getApplicationContext(), RevenueActivity.class);
startActivityForResult(intent_rev, REQUEST_CODE_REVENUE);
}
});
Button product = (Button) findViewById(R.id.product);
product.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent_pro = new Intent(getApplicationContext(), ProductActivity.class);
startActivityForResult(intent_pro, REQUEST_CODE_PRODUCT);
}
});
Button tologin = (Button) findViewById(R.id.tologin);
tologin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent_login = new Intent(getApplicationContext(), MainActivity.class);
setResult(RESULT_OK, intent_login);
finish();
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch(requestCode){
case REQUEST_CODE_CUSTOM :
Toast.makeText(getApplicationContext(), data.getStringExtra("from") + "에서 온 Intent입니다.", Toast.LENGTH_LONG).show(); break;
case REQUEST_CODE_PRODUCT :
Toast.makeText(getApplicationContext(), data.getStringExtra("from") + "에서 온 Intent입니다.", Toast.LENGTH_LONG).show(); break;
case REQUEST_CODE_REVENUE :
Toast.makeText(getApplicationContext(), data.getStringExtra("from") + "에서 온 Intent입니다.", Toast.LENGTH_LONG).show(); break;
default :
Toast.makeText(getApplicationContext(), "ERROR occured.", Toast.LENGTH_LONG).show();
}
}
}
CustomActivity.java
(子活动之一,它的代码与其他完全相同sub-activities)
public class CustomActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_custom);
Button tomenu = (Button) findViewById(R.id.tomenu);
Button tologin = (Button) findViewById(R.id.tologin);
tomenu.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent from_cus = new Intent(getApplicationContext(), MenuActivity.class);
from_cus.putExtra("from", "CustomActivity");
setResult(RESULT_OK, from_cus);
finish();
}
});
tologin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent from_cus = new Intent(getApplicationContext(), MainActivity.class);
from_cus.putExtra("from", "CustomActivity");
from_cus.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP|Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(from_cus);
finish();
}
});
}
}
从文档中,它说:
This is called for activities that set launchMode to "singleTop" in their package, or if a client used the FLAG_ACTIVITY_SINGLE_TOP flag when calling startActivity(Intent). In either case, when the activity is re-launched while at the top of the activity stack instead of a new instance of the activity being started, onNewIntent() will be called on the existing instance with the Intent that was used to re-launch it.
因此,如果您仔细阅读,只要 activity 的同一实例获得新意图,onNewIntent()
总会被触发。在您的情况下,您发送的是 RESULT_OK 意图,因此最终 onNewIntent()
会收到它。
并且每当你从父activity调用startActivityForResult()
时,父activity会等待结果,此时父activity会在前台返回,即使我们不将任何结果发送回 activity,也会调用 onActivityResult 并发送 RESULT_CANCELED 响应代码。这就是这条链的设计方式。
简而言之,onNewIntent() 被调用用于任何进入您的 activity 的意图。
OnActivityResult() returns 由 startActivityForResult()
启动的意图的结果
Please look at this photo
我想让应用程序看起来像那张照片..
当我点击 sub-activities 上的 MainActivity 按钮时, OnActivityResult() 和 OnNewIntent() 都在 MainActicity 中调用。
我打算调用 OnActivityResult() 从 MenuActivity 返回, 并调用 OnNewIntent() 从 subs 返回。
我了解到妈妈activity通过StartActivityForResult()调用childactivity, child 为 return 调用 setResult()。 而当我要调用的 objective activity 还活着的时候, 我了解到需要 onNewContent() 因为 objective activity 不调用 onCrete()。
但我想我错了。请让我知道 OnActivityResult() 和 OnNewResult() 有什么区别? 而且我还想知道为什么即使在 setResult() 中没有调用 setResult 也会调用 OnActivityResult。
提前致谢。
MainActivity.java
public class MainActivity extends AppCompatActivity {
EditText editText;
EditText editText2;
public static final int REQUEST_CODE_MENU = 100;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editText = (EditText) findViewById(R.id.editText);
editText2 = (EditText) findViewById(R.id.editText2);
Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(editText.getText().toString().length() != 0 &&
editText2.getText().toString().length() != 0){
Intent intent = new Intent(getApplicationContext(), MenuActivity.class);
startActivityForResult(intent, REQUEST_CODE_MENU);
} else {
Toast.makeText(getApplicationContext(),"ID와 비밀번호를 입력해주세요.", Toast.LENGTH_LONG).show();
}
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE_MENU) {
if (resultCode == RESULT_OK) {
Toast.makeText(getApplicationContext(), "MenuActivity에서 온 Intent입니다.", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(getApplicationContext(), "ERROR : The value of resultCode is not RESULT_OK", Toast.LENGTH_LONG).show();
}
} else if {
Toast.makeText(getApplicationContext(), "ERROR : The value of requestCode is not REQUEST_CODE_MENU (100)", Toast.LENGTH_LONG).show();
}
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
Toast.makeText(getApplicationContext(), intent.getStringExtra("from") + "에서 온 Intent입니다.", Toast.LENGTH_LONG).show();
}
}
MenuActivity.java
public class MenuActivity extends AppCompatActivity {
public static final int REQUEST_CODE_CUSTOM = 200;
public static final int REQUEST_CODE_REVENUE = 300;
public static final int REQUEST_CODE_PRODUCT = 400;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_menu);
Button custom = (Button) findViewById(R.id.custom);
custom.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent_cus = new Intent(getApplicationContext(), CustomActivity.class);
startActivityForResult(intent_cus, REQUEST_CODE_CUSTOM);
}
});
Button revenue = (Button) findViewById(R.id.revenue);
revenue.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent_rev = new Intent(getApplicationContext(), RevenueActivity.class);
startActivityForResult(intent_rev, REQUEST_CODE_REVENUE);
}
});
Button product = (Button) findViewById(R.id.product);
product.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent_pro = new Intent(getApplicationContext(), ProductActivity.class);
startActivityForResult(intent_pro, REQUEST_CODE_PRODUCT);
}
});
Button tologin = (Button) findViewById(R.id.tologin);
tologin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent_login = new Intent(getApplicationContext(), MainActivity.class);
setResult(RESULT_OK, intent_login);
finish();
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch(requestCode){
case REQUEST_CODE_CUSTOM :
Toast.makeText(getApplicationContext(), data.getStringExtra("from") + "에서 온 Intent입니다.", Toast.LENGTH_LONG).show(); break;
case REQUEST_CODE_PRODUCT :
Toast.makeText(getApplicationContext(), data.getStringExtra("from") + "에서 온 Intent입니다.", Toast.LENGTH_LONG).show(); break;
case REQUEST_CODE_REVENUE :
Toast.makeText(getApplicationContext(), data.getStringExtra("from") + "에서 온 Intent입니다.", Toast.LENGTH_LONG).show(); break;
default :
Toast.makeText(getApplicationContext(), "ERROR occured.", Toast.LENGTH_LONG).show();
}
}
}
CustomActivity.java (子活动之一,它的代码与其他完全相同sub-activities)
public class CustomActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_custom);
Button tomenu = (Button) findViewById(R.id.tomenu);
Button tologin = (Button) findViewById(R.id.tologin);
tomenu.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent from_cus = new Intent(getApplicationContext(), MenuActivity.class);
from_cus.putExtra("from", "CustomActivity");
setResult(RESULT_OK, from_cus);
finish();
}
});
tologin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent from_cus = new Intent(getApplicationContext(), MainActivity.class);
from_cus.putExtra("from", "CustomActivity");
from_cus.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP|Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(from_cus);
finish();
}
});
}
}
从文档中,它说:
This is called for activities that set launchMode to "singleTop" in their package, or if a client used the FLAG_ACTIVITY_SINGLE_TOP flag when calling startActivity(Intent). In either case, when the activity is re-launched while at the top of the activity stack instead of a new instance of the activity being started, onNewIntent() will be called on the existing instance with the Intent that was used to re-launch it.
因此,如果您仔细阅读,只要 activity 的同一实例获得新意图,onNewIntent()
总会被触发。在您的情况下,您发送的是 RESULT_OK 意图,因此最终 onNewIntent()
会收到它。
并且每当你从父activity调用startActivityForResult()
时,父activity会等待结果,此时父activity会在前台返回,即使我们不将任何结果发送回 activity,也会调用 onActivityResult 并发送 RESULT_CANCELED 响应代码。这就是这条链的设计方式。
简而言之,onNewIntent() 被调用用于任何进入您的 activity 的意图。
OnActivityResult() returns 由 startActivityForResult()
启动的意图的结果