如何在两个 Activity 之间传递参数,但一个必须只支持第一个

How can I pass parameters between two Activity but one must only support the first one

我有一个activity,必须很快处理数据然后return到前面的activity,我举个例子:我有一个MainActivity class通过 Intent 将信息传递给另一个 Loader class,这会处理数据并将其发送回 MainActivity。我不知道如何把这个程序付诸实践...

借助 android startActivityForResult() 方法,您可以从另一个 activity.

获取结果

借助 android startActivityForResult() 方法,您可以将信息从一个 activity 发送到另一个 vice-versa。 android startActivityForResult 方法需要来自第二个 activity 的结果(要调用 activity)。

在这种情况下,我们需要覆盖在第二个 activity returns 结果时自动调用的 onActivityResult 方法。

MainActivity.java

 public class MainActivity extends Activity {  
    TextView textView1;  
    Button button1;  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
        textView1=(TextView)findViewById(R.id.textView1);  
        button1=(Button)findViewById(R.id.button1);  
        button1.setOnClickListener(new OnClickListener() {  
            @Override  
            public void onClick(View arg0) {  
                Intent intent=new Intent(MainActivity.this,SecondActivity.class);  
                startActivityForResult(intent, 2);// Activity is started with 
                                                    requestCode 2  
            }  
        });  
    } 

 // Call Back method  to get the Message form other Activity  
    @Override  
       protected void onActivityResult(int requestCode, int resultCode, Intent data)  
       {  
                 super.onActivityResult(requestCode, resultCode, data);  
                  // check if the request code is same as what is passed  here it is 2  
                   if(requestCode==2)  
                         {  
                            String message=data.getStringExtra("MESSAGE");   
                            textView1.setText(message);  
                         }  
     }  

SecondActivity.java

 public class SecondActivity extends Activity {  
    EditText editText1;  
    Button button1;  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_second);  
        editText1=(EditText)findViewById(R.id.editText1);  
            button1=(Button)findViewById(R.id.button1);  
            button1.setOnClickListener(new OnClickListener() {  
                @Override  
                public void onClick(View arg0) {  
                    String message=editText1.getText().toString();  
                    Intent intent=new Intent();  
                    intent.putExtra("MESSAGE",message);  
                    setResult(Activity.RESULT_OK,intent);  
                    finish();//finishing activity  
                }  
            });  
    }  
    @Override  
    public boolean onCreateOptionsMenu(Menu menu) {  
        // Inflate the menu; this adds items to the action bar if it is present.  
        getMenuInflater().inflate(R.menu.second, menu);  
        return true;  
    }  
}  
//do Some work
Intent i = new Intent(this,MainActivity2..class);
startActivityForResult(i,12);
}

在MainActivity2.class

// after your work complete
Intent i =new Intent();
i.putExtra("result",true);// any data you want to pass
setResult(RESULT_OK,i);

在此之后我们处理结果

protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {

switch(requestCode){

case 12:
    if(resultCode == Activity.RESULT_OK){// onsuccess do something

             boolean isSucces = data.getBooleanExtra("result",false);

     if(isSuccess)// perform action
{// show toast}
}
}
    }

从您的 MainActivity 调用 TargetActivity 使用 startActivityForResult()-

例如:

Intent intent = new Intent(this, TargetActivity.class);
intent.putExtra(); // sent your putExtra data here to pass through intent
startActivityForResult(intent, 1000);

在您的意图中,将您想要 return 的数据设置回 MainActivity。如果您不想return返回任何数据,那么您不需要设置任何数据。

例如:

在TargetActivity中如果你想发回数据:

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

如果你不想return数据:

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

现在在您的 MainActivity class 中为 onActivityResult() 方法编写以下代码。

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    if (requestCode == 1000) {
        if(resultCode == Activity.RESULT_OK){
            String result=data.getStringExtra("result");
        }
        if (resultCode == Activity.RESULT_CANCELED) {
            // Do your task here. 
        }
    }
}

我发现最好使用回调。

在装载机中: 创建内部 class

    MyCallback callback;

viod setCallback(MyCallback callback){
this.callback = callback;
}
viod onStop(){
    callback = null;
}

interface MyCallback{
    void doSomething(Params params);
}

在主要活动中: 实施 MyCallback 在 onCreate

中设置引用
Loader loader = new Loader();
loader.setCallback(this);

override method doSomething()
@override
void doSomething(Params params){
 //do your thing with the params…
}

当作业在 Loader 调用 MainActivity 中完成时:

callback.doSomething(params);

在 onStop() 中销毁 MainActivity 中的引用

loader.onStop();