将蓝牙连接传递给新的 Activity

Posted

技术标签:

【中文标题】将蓝牙连接传递给新的 Activity【英文标题】:passing a Bluetooth connection to a new Activity 【发布时间】:2011-02-17 14:21:38 【问题描述】:

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

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

我查找 Bundle 作为传递连接的一种方式,但它似乎只接受原始类型和基本类型作为值。我注意到 Intent.putExtra(String, Parcelable) 可用,但 Parcel 有点让我困惑。实现这一点的最佳方法是什么,甚至有可能吗?

一些相关代码:

//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 复杂化,但认为它仍然可能以某种方式实现?

【问题讨论】:

【参考方案1】:

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

/**
 * Change the handler (route handler info to new activity). */
public synchronized void newHandler(Handler handle) 
    mHandler = handle;

然后调用此函数,在新 Activity 启动时重新分配新 Activity 的新处理程序(例如,“StartingActivity.mBTService.newHandler(NewActivityHandler);”) 当然,当返回到 StartingActivity 时,请确保适当地重新分配 Handler ;-)

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

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

【讨论】:

【参考方案2】:

share data between activities and services 有几个选项。

更新:稍微扩展您的情况:

仅当代码在单独的进程中运行时,您才需要 IPC/Parcelable。您必须在清单中指定以使代码在单独的进程中运行:http://developer.android.com/guide/topics/fundamentals.html#procthread

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

    您当然可以在同一进程中传递数据库连接,因为这是一个 java 应用程序。但是您不能通过 IPC 在进程之间传递它,因为所有 classes need to implement Parcelable in order to pass via IPC 和 AFAIK,SQLiteDatabase 都没有实现 parcelable(与本机函数对话的类通常不会)。

【讨论】:

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

以上是关于将蓝牙连接传递给新的 Activity的主要内容,如果未能解决你的问题,请参考以下文章

无法将 autoID 传递给新的 VC

如何将 DataTable.Select() 结果传递给新的 DataTable?

如何将特定的 ListTile 变量传递给新的页面路由 onTap?

将 log4net 配置文件传递给新的 AppDomain

如何在 Swift 3.0 中将 TableViewCell 值传递给新的 ViewController?

odoo 由动作传递默认值给新的模型