Return 列表从 Activity 到 Main Activity?

Return list from a Activity to Main Activity?

我想 MainActivity 调用一个 SecondActivitySecondActivity return 一个字符串列表。

我读过的每个答案都解释了如何将数据从 MainActivity 传递到 SecondActivity

我创建了一个 Activity 来计算内部网络中所有可能的 IP 并将它们保存在一个列表中。 我想将此列表传递给 MainActivity。 你能建议我一些链接或代码来解决我的问题吗? 我是 Android Studio 的新手,但我必须这样做。 这是来自 MainActivity

的片段代码
 b1.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    boolean check_conn = false;
                    check_conn = checkInternetConnection();//check if you are on internet

                    if (check_conn){
                        //we have connection
                        // find the all the possible IPs
                        Intent intent = new Intent(MainActivity.this, rangeIP_test.class);
                        startActivity(intent);
                    }
                    else {
                        // do something annoying
                        Toast.makeText(MainActivity.this,
                                "We need Internet Connection!", Toast.LENGTH_LONG).show();
                    }
                }
            });

计算IPsrangeIP_testActivity

WifiManager my_wifi = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
String subnet = getSubnetAddress(my_wifi.getDhcpInfo().gateway);
IPs = findIP(subnet);

public List<String> findIP(String subnet){
        List<String> all_IPs;// All IPs on network
        all_IPs = new ArrayList<>();

        for (int i=2; i<255; i++){
            String host = subnet + "." + i;

            all_IPs.add(host);
        }
        return all_IPs;
    }

您可以直接将列表传递给 intent extras

像这样

Intent intent = getIntent();  
intent.putStringArrayListExtra("test", (ArrayList<String>) all_IPs);

在另一个activity中,您可以像下面这样接收

ArrayList<String> test = getIntent().getStringArrayListExtra("test");

使用 startActivityForResult 和 onActivityResult 可能有效。

调用 rangeIP_test Activity 开始ActivityForResult() return 你的列表由 setResult()。作业完成后不要忘记 finish()。

启动 activity、rangeIP_test,结果(即主机字符串列表)如下所示:

 Intent intent = new Intent(MainActivity.this, rangeIP_test.class);
 startActivityForResult(intent,RC_LIST_STRING);

MainActivity.java 中将 RC_LIST_STRING 定义为这样的字段:

 private static final int RC_LIST_STRING = 10001;

像这样覆盖 MainActivity.java 中的 onActivityResult()

 @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        // Check which request we're responding to
        if (requestCode == RC_LIST_STRING) {
            // Make sure the request was successful
            if (resultCode == RESULT_OK) {
               // get the list of strings here
               ArrayList<String> myHosts = (ArrayList<String>) data.getSerializableExtra("myHosts"); // key must be matching 
               // do operations on the list
            }
        }
    }

rangeIP_test.java中,成功获取所有主机并将它们添加到列表中后,您可以将列表传递回activity(此处为MainActivity)启动当前的任何一个activity(这里,rangeIP_test)像这样:

Intent intent = new Intent();
intent.putExtra("myHosts", (Serializable) IPs);
setResult(RESULT_OK, intent);
finish();

现在,您已完成 rangeIP_test activity,您将返回 MainActivity,因为您已覆盖 onActivityResult(),您将获得那边的主机列表。

请记住,在此示例中,您将主机列表转换为序列化类型并将其传递给之前的 activity。自 String and ArrayList already implement Serializable interface, you won't get any unable to marshal value error。 但是,在围绕活动传递模型对象时,您需要首先使模型 class 实现 Serializable 接口,然后按上述方式进一步处理。

更好的方法是将模型 classes 转换为 Parcelable,然后在活动之间传递数据。请参阅此 link 了解更多信息。