求android中切换activity时对象的传递问题

时间:2021-07-30 15:13:05
比如我在activity1中new了一个对象object1,现在需要切换到activity2,而object1在activity2中也要使用。
这时需要在activity之间传递对象,百度看网上的方法是用object1继承Serializable或Parcelable接口,然后用intent.putParcelableArrayListExtra()实现。
我想问的是这样传递对象是将对象复制了一遍传过去还是只传递的对象的引用?如果只传的引用那为什么要用这么复杂的方法?对象的引用只一个int大小,和int一样的传递不方便么?

11 个解决方案

#1


可以肯定不是传递引用过去的,你可以写两个Activity试下,Activity2把传递过去的对象数值改变后,finish()掉,回到Activity1,值还是没有改变的,

#2


如果你觉得现在用的这种方法putParcelableArrayListExtra()不好记,你可以采用
Bundle 将你的对象包含进去,然后putExtra()来进行传递,虽然多做了一步,但是范围比较广啊

#3


引用 1 楼 u011774151 的回复:
可以肯定不是传递引用过去的,你可以写两个Activity试下,Activity2把传递过去的对象数值改变后,finish()掉,回到Activity1,值还是没有改变的,


引用 2 楼 f839903061 的回复:
如果你觉得现在用的这种方法putParcelableArrayListExtra()不好记,你可以采用
Bundle 将你的对象包含进去,然后putExtra()来进行传递,虽然多做了一步,但是范围比较广啊

感谢回答,如果我希望传递引用怎么办?
我现在是一个类似TCP客户端的程序,我希望在登录activity里输入ip地址,然后点“连接”,后台就创建了一个thread用于通讯。然后程序要跳转到一个实际发送/接收的activity里,我想把那个thread的引用直接传过去用,求怎么做。

#4


求助,自己顶。

#5


引用 3 楼 a1193561652 的回复:
Quote: 引用 1 楼 u011774151 的回复:

可以肯定不是传递引用过去的,你可以写两个Activity试下,Activity2把传递过去的对象数值改变后,finish()掉,回到Activity1,值还是没有改变的,


引用 2 楼 f839903061 的回复:
如果你觉得现在用的这种方法putParcelableArrayListExtra()不好记,你可以采用
Bundle 将你的对象包含进去,然后putExtra()来进行传递,虽然多做了一步,但是范围比较广啊

感谢回答,如果我希望传递引用怎么办?
我现在是一个类似TCP客户端的程序,我希望在登录activity里输入ip地址,然后点“连接”,后台就创建了一个thread用于通讯。然后程序要跳转到一个实际发送/接收的activity里,我想把那个thread的引用直接传过去用,求怎么做。


建立不要直接使用Thread, 可以使用IntentService在后台通讯,接收到响应后通过广播把接收到的Json的对象传递到对应在Activity,当然你需要在相应的Activity注册一个广播接收器。

#6


引用 5 楼 u011774151 的回复:
建立不要直接使用Thread, 可以使用IntentService在后台通讯,接收到响应后通过广播把接收到的Json的对象传递到对应在Activity,当然你需要在相应的Activity注册一个广播接收器。

如果这样,那我要在第二个activity里发送数据给服务器怎么做呢?

#7


引用 6 楼 a1193561652 的回复:
Quote: 引用 5 楼 u011774151 的回复:

建立不要直接使用Thread, 可以使用IntentService在后台通讯,接收到响应后通过广播把接收到的Json的对象传递到对应在Activity,当然你需要在相应的Activity注册一个广播接收器。

如果这样,那我要在第二个activity里发送数据给服务器怎么做呢?

第二个Activity当然需要另外写一个Service,但如果逻辑不复杂,页面代码量不大的话,你用Thread是没问题的。

#8


还有就是你之前说的要把Thread传递过去,其实没这个必要。你在各自的页面new Thread()就可以了,而且Thread里面的代码每个页面都不一样,没有必要传递吧。

#9


引用 8 楼 u011774151 的回复:
还有就是你之前说的要把Thread传递过去,其实没这个必要。你在各自的页面new Thread()就可以了,而且Thread里面的代码每个页面都不一样,没有必要传递吧。
我是希望只new一个TCP socket,在第一个activity里连接,连接成功了就传递这个socket到第二个activity里去通讯。

#10


这样行不?初始化时调用SocketUtil.init(), 以后需要使用就调用getSocket(),把这些方法写到一个工具类中,维护着一个静态变量。

public class SocketUtil {
private static Socket mSocket;
public static void initSocket(String ip, int port){
try {
mSocket = new Socket(ip, port);
} catch (IOException e) {
e.printStackTrace();
}
}

public static Socket getmSocket(){
return mSocket;
}
}

#11


引用 10 楼 u011774151 的回复:
这样行不?初始化时调用SocketUtil.init(), 以后需要使用就调用getSocket(),把这些方法写到一个工具类中,维护着一个静态变量。

public class SocketUtil {
private static Socket mSocket;
public static void initSocket(String ip, int port){
try {
mSocket = new Socket(ip, port);
} catch (IOException e) {
e.printStackTrace();
}
}

public static Socket getmSocket(){
return mSocket;
}
}
单例模式?感谢,我试试。

#1


可以肯定不是传递引用过去的,你可以写两个Activity试下,Activity2把传递过去的对象数值改变后,finish()掉,回到Activity1,值还是没有改变的,

#2


如果你觉得现在用的这种方法putParcelableArrayListExtra()不好记,你可以采用
Bundle 将你的对象包含进去,然后putExtra()来进行传递,虽然多做了一步,但是范围比较广啊

#3


引用 1 楼 u011774151 的回复:
可以肯定不是传递引用过去的,你可以写两个Activity试下,Activity2把传递过去的对象数值改变后,finish()掉,回到Activity1,值还是没有改变的,


引用 2 楼 f839903061 的回复:
如果你觉得现在用的这种方法putParcelableArrayListExtra()不好记,你可以采用
Bundle 将你的对象包含进去,然后putExtra()来进行传递,虽然多做了一步,但是范围比较广啊

感谢回答,如果我希望传递引用怎么办?
我现在是一个类似TCP客户端的程序,我希望在登录activity里输入ip地址,然后点“连接”,后台就创建了一个thread用于通讯。然后程序要跳转到一个实际发送/接收的activity里,我想把那个thread的引用直接传过去用,求怎么做。

#4


求助,自己顶。

#5


引用 3 楼 a1193561652 的回复:
Quote: 引用 1 楼 u011774151 的回复:

可以肯定不是传递引用过去的,你可以写两个Activity试下,Activity2把传递过去的对象数值改变后,finish()掉,回到Activity1,值还是没有改变的,


引用 2 楼 f839903061 的回复:
如果你觉得现在用的这种方法putParcelableArrayListExtra()不好记,你可以采用
Bundle 将你的对象包含进去,然后putExtra()来进行传递,虽然多做了一步,但是范围比较广啊

感谢回答,如果我希望传递引用怎么办?
我现在是一个类似TCP客户端的程序,我希望在登录activity里输入ip地址,然后点“连接”,后台就创建了一个thread用于通讯。然后程序要跳转到一个实际发送/接收的activity里,我想把那个thread的引用直接传过去用,求怎么做。


建立不要直接使用Thread, 可以使用IntentService在后台通讯,接收到响应后通过广播把接收到的Json的对象传递到对应在Activity,当然你需要在相应的Activity注册一个广播接收器。

#6


引用 5 楼 u011774151 的回复:
建立不要直接使用Thread, 可以使用IntentService在后台通讯,接收到响应后通过广播把接收到的Json的对象传递到对应在Activity,当然你需要在相应的Activity注册一个广播接收器。

如果这样,那我要在第二个activity里发送数据给服务器怎么做呢?

#7


引用 6 楼 a1193561652 的回复:
Quote: 引用 5 楼 u011774151 的回复:

建立不要直接使用Thread, 可以使用IntentService在后台通讯,接收到响应后通过广播把接收到的Json的对象传递到对应在Activity,当然你需要在相应的Activity注册一个广播接收器。

如果这样,那我要在第二个activity里发送数据给服务器怎么做呢?

第二个Activity当然需要另外写一个Service,但如果逻辑不复杂,页面代码量不大的话,你用Thread是没问题的。

#8


还有就是你之前说的要把Thread传递过去,其实没这个必要。你在各自的页面new Thread()就可以了,而且Thread里面的代码每个页面都不一样,没有必要传递吧。

#9


引用 8 楼 u011774151 的回复:
还有就是你之前说的要把Thread传递过去,其实没这个必要。你在各自的页面new Thread()就可以了,而且Thread里面的代码每个页面都不一样,没有必要传递吧。
我是希望只new一个TCP socket,在第一个activity里连接,连接成功了就传递这个socket到第二个activity里去通讯。

#10


这样行不?初始化时调用SocketUtil.init(), 以后需要使用就调用getSocket(),把这些方法写到一个工具类中,维护着一个静态变量。

public class SocketUtil {
private static Socket mSocket;
public static void initSocket(String ip, int port){
try {
mSocket = new Socket(ip, port);
} catch (IOException e) {
e.printStackTrace();
}
}

public static Socket getmSocket(){
return mSocket;
}
}

#11


引用 10 楼 u011774151 的回复:
这样行不?初始化时调用SocketUtil.init(), 以后需要使用就调用getSocket(),把这些方法写到一个工具类中,维护着一个静态变量。

public class SocketUtil {
private static Socket mSocket;
public static void initSocket(String ip, int port){
try {
mSocket = new Socket(ip, port);
} catch (IOException e) {
e.printStackTrace();
}
}

public static Socket getmSocket(){
return mSocket;
}
}
单例模式?感谢,我试试。