我有一个包含主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复杂化,但认为它仍然可能以某种方式?
答案 0 :(得分: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; - )
令我惊讶的是,它的工作原理是,无需通过应用程序使蓝牙服务成为单件,可分割对象或全局服务(我没有能够成功编码)。
我会更彻底地测试,但希望这有助于某人(关于我回馈的东西 - 我从这个社区中学到了很多东西)!
答案 1 :(得分:0)
share data between activities and services有几种选择。
更新:稍微扩展您的情况:
当代码在不同的进程中运行时,您只需要IPC / Parcelable。您必须在清单中指定以使代码在单独的进程中运行:http://developer.android.com/guide/topics/fundamentals.html#procthread
在您的情况下,我认为您的活动在同一个过程中运行,因此您只需使用自定义Application类来存储/共享此数据。如果从不同的线程访问它,请确保它是synchronized
。或者,您可以使用第一个链接中列出的任何其他方法。
您当然可以在同一个进程中传递数据库连接,因为这是一个java应用程序。但是你不能在进程之间通过IPC传递它,因为所有classes need to implement Parcelable in order to pass via IPC和AFAIK,SQLiteDatabase都没有实现parcelable(与本机函数通信的类通常不会)。