将蓝牙连接传递给新的 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的主要内容,如果未能解决你的问题,请参考以下文章
如何将 DataTable.Select() 结果传递给新的 DataTable?
如何将特定的 ListTile 变量传递给新的页面路由 onTap?