Android Fragment中startActivityForResult()vs 之间的区别是什么getActivity().startActivityForResult()?onActivityForResult()在片段中调用时的行为差异是什么?
我有三个活动
MessagesAttachPhotoActivityMessageGalleryFolderSelectorActivityImagePickerActivityMessagesAttachPhotoActivity呼吁MessageGalleryFolderSelectorActivity有startActivityForResult().
MessageGalleryFolderSelectorActivity 活动显示手机上的照片文件夹,一个选择文件夹.
ImagePickerActivity然后调用setActivityForResult().一旦选择了图像ImagePickerActivity,它就会被传递回MessagesAttachPhotoActivityvia MessageGalleryFolderSelectorActivity.
当我第一次运行应用程序时,一切正常.但是,如果我之后尝试再次选择图像,MessageGalleryFolderSelectorActivity则不会在之后关闭setResult().
我已经打过电话finish(),this.finish(),((Activity)getApplicationContext()).finish(),并super.onBackPressed()没有成功.
为什么活动不会在连续运行中关闭?
Intent intent;
Bundle arguments = new Bundle();
Bundle bundle;
intent = new Intent(this, MessageGalleryFolderSelectorActivity.class);
bundle = new Bundle();
bundle.putInt(Constants.INTENT_EXTRA_LIMIT, Constants.IMAGES_SELECT_LIMIT);
bundle.putInt("Request", MessageThread.MessageType.IMAGE);
intent.putExtras(bundle);
startActivityForResult(intent, MessageThread.MessageType.IMAGE);
Run Code Online (Sandbox Code Playgroud)
imagesIntent.putExtra(ImagePickerActivity.INTENT_EXTRA_MODE,
ImagePickerActivity.MODE_MULTIPLE);
imagesIntent.putExtra(ImagePickerActivity.INTENT_EXTRA_LIMIT, 10);
imagesIntent.putExtra(ImagePickerActivity.INTENT_EXTRA_SHOW_CAMERA, false);
imagesIntent.putExtra(ImagePickerActivity.INTENT_EXTRA_ALBUM,album);
//imagesIntent.putExtra(ImagePickerActivity.INTENT_EXTRA_SELECTED_IMAGES, images);
startActivityForResult(imagesIntent, MessageThread.MessageType.IMAGE);
Run Code Online (Sandbox Code Playgroud)
Intent data = …Run Code Online (Sandbox Code Playgroud) android android-intent android-activity startactivityforresult
我使用 来从活动 A 调用活动 B,ActivityResultLauncher并在任务完成时设置活动 B 的结果。如果方向不改变,这将非常有效。问题是当我从活动 B 更改方向然后设置结果时,则registerForActivityResult不会调用活动 A。有人可以告诉我,可能是什么问题吗?
startActivityForResult注意:如果我使用和 ,我不会遇到这个问题onActivityResult。我将其更改为ActivityResultLauncherasstartActivityForResult已弃用。
活动A示例代码:
private lateinit var launcher: ActivityResultLauncher<Intent>
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(layout)
setLauncherResult()
}
private fun setLauncherResult() {
launcher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result: ActivityResult ->
if (result.resultCode == Activity.RESULT_OK) {
//Do operations here
}
}
//On button click starting activity B using launcher
val intent = Intent(activityA, activityB)
launcher.launch(intent)
}
Run Code Online (Sandbox Code Playgroud)
活动B示例代码:
//setting result
val …Run Code Online (Sandbox Code Playgroud) android android-intent kotlin kotlin-android-extensions startactivityforresult
我有两个活动,一个是UserActivity,另一个是CartActivity我正在展示产品清单UserActivity.点击按钮,AddtoCart我将产品添加到购物车.我正面临这个问题:
当我添加单击按钮AddtoCart时,操作栏中有一个购物车图标,我textview在该购物车图标上有一个显示购物车计数器的自定义布局.每当我点击按钮时,该计数器就会更新AddtoCart.现在我转到CartActivity并删除购物车中的一些产品.现在按回按钮返回时UserActivity,计数器文本视图不会更新.
我已经阅读了几个关于按下后退的更新的方法,如问题中的" 返回"按钮和刷新之前的活动.答案中给出的两种方法是通过覆盖结果的OnResume()方法UserActivity或启动结果的活动.
我想我需要将一个名为DeleteCounterfrom 的变量传递CartActivity给UserActivity当我按下后退按钮并从计数器中的原始产品数中减去它TextView并更新文本视图.
这是部分代码,UserActivity我有这个代码只更新购物车计数器的功能,当我点击一个按钮时调用.另外onActivityResult()在这个评论中的代码我从上面的答案尝试了SO问题链接.它没有成功:
public class UserActivity extends AppCompatActivity{
private int cartindex = 0;
private TextView counterTV = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_user);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
}
// @Override
// protected void onActivityResult(int requestCode, int …Run Code Online (Sandbox Code Playgroud) 背景:我的应用程序 (A) 被其他应用程序 (B) 用来代表执行操作。
预期结果 :
当前的行为: startActivityForResult应用B(窗口)中打开应用程序A的所谓活动,所以当我崩溃的应用程序B中的应用一onDestroybaseActivity的调用,但不应用A.推出的螺纹,情况并非如此。如果我startActivity是使用singleTask的launchMode,因此,使用后一种方法,我在应用程序 A 窗口中启动了应用程序 A 活动,而不是在应用程序 B 窗口内启动,因此我可以模拟应用程序 A 的崩溃,并得到预期的结果。
根据Ian Lake 的评论,似乎无法在其自己的应用程序返回堆栈中启动应用程序 A 的活动。
[编辑 1]
想分享这个信息:
当我直接通过启动器图标启动我的应用程序并杀死它时 => 进程立即被终止。
当我通过 startActivityForResult => 启动我的应用程序时,该进程在大约 2/3 秒后被终止。
检查使用:
adb shell
top -m 5
Run Code Online (Sandbox Code Playgroud) android android-intent android-lifecycle startactivityforresult
OnActivityResult()在 androidx 中已弃用。我参考了以下链接
https://developer.android.com/training/basics/intents/result
https://developer.android.com/jetpack/androidx/releases/activity
https://proandroiddev.com/is- onactivityresult-deprecated-in-activity-results-api-lets-deep-dive-into-it-302d5cf6edd
我在我的项目中实现了注册事情..like .我通过注册活动来创建 resultcontract 代替startActivityForResult i 替换 resultcontract.launch(intent)并获得结果resultcontract (按照上面的链接)。现在我怀疑打开 gps 的功能。为此,我们使用了
val rae = e as ResolvableApiException
rae.startResolutionForResult(context, GPS_REQUEST)
Run Code Online (Sandbox Code Playgroud)
早些时候 startActivityForResult,现在 startResolutionForResult
对如何获得 gps 请求的结果感到困惑(在代码中,我们在 onActivityResult 中获得结果)。我该如何使用新方法实现这一点?
android deprecated onactivityresult startactivityforresult androidx
我正在开发一个应用程序,它应该将一些文本返回给启动意图的应用程序.
但启动意图的应用程序是IME /软键盘.因此,StartActivityForResult不可用,因为IME是一项服务.
我怎样才能做到这一点?
到目前为止我得到了什么:
键盘:
final Intent intent = new Intent("com.example.helloworld.GETTEXT");
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
intent.putExtra("keyboard", true);
startActivity(intent);
Run Code Online (Sandbox Code Playgroud)
其他应用:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Bundle extras = getIntent().getExtras();
if (extras == null){
return;
} else {
finish();
}
}
@Override
public void finish() {
Intent data = new Intent();
data.putExtra("test", "PASSED");
setResult(RESULT_OK, data);
super.finish();
}
Run Code Online (Sandbox Code Playgroud) 我使用startActivityForResult从父活动开始了一个子活动.在子活动中执行所需的功能后,我使用setResult设置结果.但是我没有从儿童活动得到父母活动的结果.
继承我的代码.
以下是我如何从父活动中调用我的子活动.
Intent i = new Intent(MainActivity.this, Child.class);
i.putExtra("ID", intID);
i.putExtra("aID", aID);
i.putExtra("myMsg", myMsg);
startActivityForResult(i, 1);
Run Code Online (Sandbox Code Playgroud)
这是我从我的孩子活动设置结果的方式.
@Override
public void onBackPressed() {
super.onBackPressed();
Intent resultInt = new Intent();
resultInt.putExtra("Result", "Done");
setResult(Activity.RESULT_OK, resultInt);
finish();
}
Run Code Online (Sandbox Code Playgroud)
这是我的onActivityResult
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 1) {
if (resultCode == Activity.RESULT_OK) {
if(data!=null) {
Toast.makeText(MainActivity.this, "Data received", Toast.LENGTH_SHORT).show();
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
这里我检查resultCode == Activity.RESULT_OK的时间是假的.我还检查了在if if条件之外传递的意图及其返回的null. …
android android-intent android-activity onactivityresult startactivityforresult
我尝试在片段中获得结果。片段中的代码
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (resultCode != Activity.RESULT_OK) return
val bundle = data?.extras
when (requestCode) {
LicenseActivationActivity.REQUEST_RESULT_COUNT_ENTERPRISE ->
//
}
}
Run Code Online (Sandbox Code Playgroud)
这段代码被调用。而且还有 DrawerActivity 中的 onActivityResult 方法
是否只在片段中调用 onActivityResult ?
更新
DrawerActivity 中的这段代码
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (resultCode == Activity.RESULT_OK) {
WayBillsActivity.start(this)
finish()
}
}
Run Code Online (Sandbox Code Playgroud)
不知为何,也满足了,不过是在fragment中的onActivityResult之后。
当我调用startActivityForResult(new Intent(getActivity(), VkAuth.class), VK_ID);三星时(在 HTC 和 Nexus 上一切正常),onActivityResult在创建 VkAuth 活动之前调用 requestCode == VK_ID 和结果代码 0(已取消)。
父 Activity 具有android:launchMode="singleInstance". startActivityForResult从附加到父 Activity 的 Fragment 调用。日志
E/AuthenticationFragment: vkLogIn
E/AuthenticationFragment: startActivityForResult 9101
E/AuthenticationFragment: onPause
E/MainActivity: onPause
E/MainActivity: onActivityResult before super: request - 271245, result - 0
E/AuthenticationFragment: request - 9101, result - 0
E/MainActivity: onActivityResult after super: request - 271245, result - 0
E/AuthenticationFragment: onPause
E/MainActivity: onPause
E/VkAuth: onCreate
E/VkAuth: onResume
Run Code Online (Sandbox Code Playgroud)