Java 将蓝牙连接传递到新活动

Java 将蓝牙连接传递到新活动,java,android,multithreading,sqlite,interprocess,Java,Android,Multithreading,Sqlite,Interprocess,我有一个包含主活动的应用程序,它有一个非常简单的屏幕,上面有所有应用程序设置选项和一些用户选择。主屏幕按钮启动其他活动 (1) 我现在正在应用程序中实现蓝牙扫描仪,我希望能够编辑设置并在主活动上建立蓝牙连接,并将该连接(可能通过捆绑或包裹?)传递到其他活动 我查找Bundle作为传递连接的一种方式,但它似乎只接受基本类型和基本类型作为值。我注意到了这个意图。putExtra(绳子,包裹)是可用的,但包裹有点让我困惑。实现这一点的最佳方式是什么,甚至可能是什么 一些相关代码: //subclass

我有一个包含主活动的应用程序,它有一个非常简单的屏幕,上面有所有应用程序设置选项和一些用户选择。主屏幕按钮启动其他活动

(1) 我现在正在应用程序中实现蓝牙扫描仪,我希望能够编辑设置并在主活动上建立蓝牙连接,并将该连接(可能通过捆绑或包裹?)传递到其他活动

我查找Bundle作为传递连接的一种方式,但它似乎只接受基本类型和基本类型作为值。我注意到了这个意图。putExtra(绳子,包裹)是可用的,但包裹有点让我困惑。实现这一点的最佳方式是什么,甚至可能是什么

一些相关代码:

//subclass definitions for the Runnables which start the applications in their own threads
private final Handler smsHandler = new Handler();
private final Handler smsOutHandler = new Handler();

private final Runnable smsIntentRunnable = new Runnable() {
    public void run() {
        Intent smsIntent = new Intent(smsMobile.this, smsActivity.class);
        startActivity(smsIntent);
    }
};

private final Runnable smsOutIntentRunnable = new Runnable() {
    public void run() {
        Intent smsOutIntent = new Intent(smsMobile.this, smsOutActivity.class);
        startActivity(smsOutIntent);
    }
};

//button listeners located in onCreate(), which start the Activities
newTicket.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
        smsHandler.post(smsIntentRunnable);
    }
});

updateTicket.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
        smsOutHandler.post(smsOutIntentRunnable);
    }
});

(2) 我还可以传递数据库连接吗?我知道SQLiteOpenHelper必须是子类的,这可能会使IPC复杂化,但我认为这在某种程度上仍然是可能的?

有几个选项可以选择

更新:要进一步了解您的情况:

仅当代码在单独的进程中运行时,才需要IPC/Parcelable。您必须在清单中指定以使代码在单独的进程中运行:

  • 在您的情况下,我假设您的活动在同一个进程中运行,因此您可以简单地使用自定义应用程序类来存储/共享这些数据。如果您从不同的线程访问它,请确保它是同步的。或者,您可以使用第一个链接中列出的任何其他方法

  • 当然,您可以在同一进程内传递数据库连接,因为这是一个java应用程序。但您不能在进程之间通过IPC传递它,因为all and、AFAIK、SQLiteDatabase不实现parcelable(与本机函数通信的类通常不实现)


  • 我正在重写一个应用程序,以便在两个活动之间共享蓝牙服务。在前面,我刚刚解决了这个问题,在启动活动(设置服务的地方和启动其他活动的地方)中将蓝牙服务初始化为公共对象,然后从新活动调用公共服务的.read()和.write()函数。这对于编写来说很好,但是对于读取来说有点繁重(每次我希望返回数据时都必须启动一个线程,坐在那里等待数据)。我已经迁移了所有其他项目,以便在服务读取某些关键数据时,只执行蓝牙服务处理程序提示的某些操作(例如,在收到编码温度数据时更新用户界面上的温度)。 为了能够在这两种活动中进行更优雅的阅读,我在蓝牙服务中添加了一个新功能:

    /**
     * Change the handler (route handler info to new activity). */
    public synchronized void newHandler(Handler handle) {
        mHandler = handle;
    }
    
    然后在启动新活动时调用此函数从新活动重新分配新处理程序(例如,“StartingActivity.mBTService.newHandler(NewActivityHandler);”) 当然,当返回到StartingActivity时,请确保适当地重新分配处理程序;-)

    令我惊讶的是,它可以正常工作,而无需通过应用程序将蓝牙服务设置为单例、可打包对象或全局服务(我无法成功编写任何一个应用程序)


    我将进行更彻底的测试,但希望这能帮助一些人(大约是时候我回馈一些东西了——我从这个社区学到了很多)

    本faq中唯一有用的是对android.app.Application类的引用,该类仅在全局上下文中保存一个类。没有实际的例子,信息也不明确。更新帮助很大,我应该能够找到我的方法。我希望避免使用自定义应用程序类来避免全局性的混合,但从我所读到的内容来看,这似乎是一种用于此目的的通用接口。感谢您的输入。只是出于好奇,指定线程应该在单独的进程中运行的目的是什么?他们在“流程”一节中并没有真正提到此功能的实用性。通常,您希望后台服务为多个应用程序(内容处理程序或类似程序)提供数据,以独立于任何GUI活动运行。