0

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

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

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

4

2 回答 2

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时一定要重新分配处理程序适当的;-)

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

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

于 2013-07-16T06:06:24.123 回答
0

在活动和服务之间共享数据有多种选择。

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

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

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

  2. 您当然可以在同一进程中传递数据库连接,因为这是一个 java 应用程序。但是您不能在进程之间通过 IPC 传递它,因为所有类都需要实现 Parcelable 才能通过 IPC 传递,并且,AFAIK,SQLiteDatabase 不实现 parcelable(与本机函数对话的类通常不实现)。

于 2011-02-17T14:43:54.537 回答