Android - 属于 MainActivity 的 class 对象在 startActivity 完成后与子 activity 不匹配

Android - A class object that belong to MainActivity not match with the sub-activity when startActivity is done

首先,我是Android环境的新手,所以如果我说的没有意义,请原谅。

现状

我正在做一个有两个活动的应用程序: MainActivityGraphActivity.

我还有一个 class BLEConnection,我希望它知道这两个活动。 MainActivity 只有一个按钮。

按钮的onClick():

GraphActivity graph_activity = new GraphActivity();
BLEConnection radino_right = new BLEConnection(mainThread, graph_activity);
btnConnect.setText("Connecting");

class BLEConnection 有一个 BluetoothGattCallback() 对象,当它检测到 onConnectionStateChange() 时,它会调用 MainActivity 中的线程 运行。

如果蓝牙设备已连接,String connect_status = "Connected",则此线程创建一个 Intent 并执行 startActivity()。

MainActivity 中的线程 运行:

Thread mainThread = new Thread(new Runnable() {
    @Override
    public void run() {
        if(connect_status.equals("Connected")){
            Intent nextScreen = new Intent(getApplicationContext(), ((Object) graph_activity).getClass());
            //startActivityForResult() instead of startActivity() because I want to finish() it from the MainActivity if the connection with the device is closed.
            startActivityForResult(nextScreen,1);
        }
        else{
            if(nextScreen != null){
                finishActivity(1);
            }
        }
    }
});

疑难解答

我遇到的故障排除是,我注意到属于 MainActivity 并且我传递给 BLEConnection 的对象 graph_activity 与使用 startActivity() 方法启动的真实 GraphActivity 不匹配。

有谁知道我该如何解决这个问题?

我认为,如果我在创建 activity 对象时执行 "new",它会生成一个新线程 GraphActivity,而当我调用 startActivity() 时,它会生成另一个相同的线程 class,但没有与我之前创建的先前对象链接。 我不知道怎么解决。

好的,我认为你应该重构一下。的确,您创建了 2 个不同的 graphactivity 实例。你不需要第一个。

你可以像这样使用带有监听器的单例:

1 使 BLEConnection 成为单例:

public class BLEConnection {
    private static BLEConnection singletonInstance = new BLEConnection();

    private BLEConnection() {} //constructor cannot be called from outside

    public static BLEConnection getInstance() {
        return singletonInstance;
    }

    (... your Stuff here)
}

现在 BLEConnection 将保留在内存中,如果您调用

,您将始终获得相同的实例
BLEConnection bleconnection = BLEConnection.getInstance(); 

从您应用中的任何位置。

2 创建监听接口:

public interface BLEConnectionListener {
    void statusUpdated(String newStatus);
    //you can write more functions here. Every activity from step 3 has to implement them
}

3 让您的 Activity 实现接口:

public class MainActivity implements BLEConnectionListener {
    public void statusUpdated(String newStatus) {
        //do your thread thing here if you want to...
    }
}

public class GraphActivity implements BLEConnectionListener {
    public void statusUpdated(String newStatus) {
        //do graph stuff here
    }
}

4 通知 BLEConnection 有关接口的信息:

onResume / onPause 中的 MainActivity 和 GraphActivity:

public void onResume() {
    // bla
    BLEConnection bleConnection = BLEConnection.getInstance(); 
    bleConnection.addListener(this);
}

public void onPause() {
    // bla
    BLEConnection bleConnection = BLEConnection.getInstance(); 
    bleConnection.removeListener(this);
}

更新 BLEConnection

public class BLEConnection {

    private ArrayList<BLEConnectionListener> listeners = new ArrayList<BLEConnectionListener>();

    public void addListener(BLEConnectionListener listener) {
        if (!listeners.contains(listener)) {
            listeners.add(listener);
        }
    }

    public void removeListener(BLEConnectionListener listener) {
        if (listeners.contains(listener)) {
            listeners.remove(listener);
        }
    }

    public void forwardStatusUpdate(String statusString) {
        for (BLEConnectionListener listener: listeners) {
            listener.statusUpdated(statusString);
        }
    }
}

我希望这是可以理解的。在 BLEConnection 中,您现在可以调用

forwardStatusUpdate("Connected");

通知所有听众(=活动活动)状态。