【问题标题】:Android: Passing data between service and activityAndroid:在服务和活动之间传递数据
【发布时间】:2010-09-19 20:57:07
【问题描述】:

所以我对如何做这整件事感到非常困惑,我希望有人可以为我分解一下。

我有一项服务应该始终运行,并且在某些时候它需要提醒用户某项任务即将完成(可能通过通知栏图标)。当用户接受任务时,服务需要查看本地数据库,构造一些非原始对象,并将它们交给它刚刚启动的活动。

我看了一遍,对正确的方法感到非常困惑,所以我有几个问题可以帮助我理解它。

  1. 如果一个活动创建了一个本地 SQLite 数据库,该应用程序的服务和活动是否可以稍后访问同一个数据库?

  2. 服务和活动是否需要位于相同的包中或单独的包中?我认为不会,但出于某种原因,我记得在其他地方看到过一些关于此的内容。

  3. 如何将数据从服务传输到活动?我在考虑一个内容提供商,但似乎应该有一种更简单的方法让服务只传递数据。类似于 Intent,但用于非基元。

提前致谢。

【问题讨论】:

    标签: android service


    【解决方案1】:
    1. 如果Service和Activity类在同一个包里,相信他们应该可以访问同一个私有存储空间。

    2. 我会将它们放在同一个包中,因为它们是同一个整体应用程序结构的一部分。

    3. 将数据作为键值对捆绑到 Intent 的 extras 中并启动 Activity。


    Intent intent = new Intent(this, SecondActivity.class);
    Bundle b = new Bundle();
    
    // see Bundle.putInt, etc.
    // Bundle.putSerializable for full Objects (careful there)
    b.putXXXXX("key", ITEM);  
    intent.putExtras(b);
    startActivity(intent);
    
    // -- later, in Activity
    Bundle b = this.getIntent().getExtras();
    int i = b.getInt("key");
    

    【讨论】:

    • 如果两者不在同一个包里怎么办?
    • @Nirav: Intent intent = new Intent(this, com.example.somepackage.SecondActivity.class);
    【解决方案2】:

    在同一个应用程序中,服务和活动可以访问同一个 Sqlite 数据库。我建议使用 sqlite 数据库。为简单起见,请将您的服务连接设置为本地连接,这样您就不需要 AIDL 接口和进程间通信。

    从服务通知用户,使用 NotificationManager。您可以将服务中的可序列化对象传递给意图,然后传递给启动的活动,但我建议改为传递数据库 ID。

    我们已经构建了一个新的 Android ORM 工具,您可以使用它。它包括可用于构建应用程序的原型 Activity 和 Service 类。我还没有使用该服务的示例应用程序,但接下来我会编写一个代码并尽快启动它。

    看...

    http://ormlite.com/

    还有我的博客……

    http://touchlabblog.tumblr.com/

    我目前在我正在开发的应用程序中做了一些非常繁重的数据库工作。服务与服务器检查更新,并基本上完成您想要做的事情。都是很简单的东西。

    【讨论】:

    • 更新!我创建了一个带有“做事”服务的示例应用程序。我还没有把它放到 svn 存储库中,但是你可以下载它并给它旋转。当心。服务没有“关闭”按钮...kagii.com/downloads/NotifyService.tar.gz
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多