Android:StartActivityForResult 到一个 Activity 但在另一个中返回结果

Posted

技术标签:

【中文标题】Android:StartActivityForResult 到一个 Activity 但在另一个中返回结果【英文标题】:Android: StartActivityForResult to one Activity but return result in another 【发布时间】:2017-11-17 15:54:10 【问题描述】:

目前,我有一个问题要解决。

我的应用程序允许另一个应用程序(比如说 A)启动我的应用程序并取回结果。

应用A调用:

 Intent sendIntent = 
 getPackageManager().getLaunchIntentForPackage("com.my.package");

 sendIntent.setAction(Intent.ACTION_SEND);
 sendIntent.setFlags(0);
 sendIntent.putExtra("amount", "20000");
 startActivityForResult(sendIntent, 1);

然后我的应用将启动 MainActivity。 但是,要获得结果并发送回应用程序 A,我必须开始一些其他活动,比如说:

 MainActivity -> Activity B -> Activity C --> Activity D.

结果可以从Activity C或者Activity D返回给App A。

请注意:我不能使用标志 FLAG_ACTIVITY_FORWARD_RESULT,因为从 B 到 C,我已经调用了“startActivityForResult”。 (startActivityForResult 和标志 FLAG_ACTIVITY_FORWARD_RESULT 不能一起使用)。

您能给我一些想法如何实现这一目标吗? 非常感谢。

【问题讨论】:

【参考方案1】:

使用 startActivityForResult() 方法从您的第一个活动调用第二个活动

Intent i = new Intent(this, SecondActivity.class);
startActivityForResult(i, 1);

如果您想发回数据,请在第二个活动中:

Intent returnIntent = new Intent();
returnIntent.putExtra("result",result);
setResult(Activity.RESULT_OK,returnIntent);
finish();

如果不想返回数据:

Intent returnIntent = new Intent();
setResult(Activity.RESULT_CANCELED, returnIntent);
finish();

现在在您的第一个 Activity 类中为 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

【讨论】:

这没有回答原来的问题【参考方案2】:

要返回结果,您可以从 MainActiviy 调用活动 B,然后转到活动 C,然后转到 D

如果你想回来,你应该一个一个地做,完成每个活动并在 onActivityResult 中设置结果。

如果您应该回到主要活动,请这样做:

    //in MainActivity
@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Intent intent = new Intent(MainActivity.this, ActivityB.class);
    startActivityForResult(intent, REQUEST_CODE_MAIN_ACTIVITY);



@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) 
    super.onActivityResult(requestCode, resultCode, data);
    if(requestCode == REQUEST_CODE_MAIN_ACTIVITY && resultCode == RESULT_OK)
        //maybe get back to application that called you 
    


//in Second activity
@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_B);
    Intent intent = new Intent(ActivityB.this, ActivityC.class);
    startActivityForResult(intent, REQUEST_CODE_ACTIVITY_B);



@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) 
    super.onActivityResult(requestCode, resultCode, data);
    if(requestCode == REQUEST_CODE_ACTIVITY_B && resultCode == RESULT_OK)
        setResult(RESULT_OK);
        finish();
    

如果您可以直接从 Activity D 调用第一个应用程序 您可以调用第一个应用程序并关闭您的第二个应用程序

【讨论】:

如果你完成 MainActivity 并转到 Activivty B。结果 Cancel 立即返回到应用程序 A。 不,我的意思是别的,我会记下代码,请稍候

以上是关于Android:StartActivityForResult 到一个 Activity 但在另一个中返回结果的主要内容,如果未能解决你的问题,请参考以下文章

startActivity 和 startSubActivity

无论应用程序状态如何,都可以从通知中正确启动 Activity

Android逆向系列文章— Android基础逆向

Android 逆向Android 权限 ( Android 逆向中使用的 android.permission 权限 | Android 系统中的 Linux 用户权限 )

Android 逆向Android 权限 ( Android 逆向中使用的 android.permission 权限 | Android 系统中的 Linux 用户权限 )

android 21 是啥版本