2010-09-19 76 views
18

所以我对如何做这件事情感到非常困惑,我希望有人能够为我分解一点点。Android:在服务和活动之间传递数据

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

我已经看了一遍,并得到了一个正确的方法非常困惑,所以我有几个问题,以帮助我把我的头围绕它。

  1. 如果活动能的那应用接入服务和活动,同一个数据库后创建一个本地SQLite数据库?

  2. 服务和活动是否需要在相同或不同的包中?我想不会,但由于某种原因,我记得在其他地方看到这方面的情况。

  3. 我该如何处理从服务到活动的数据传输?我在想一个内容提供商,但似乎应该有一种更简单的方式让服务交付数据。类似于意图,但对于非基元。

在此先感谢。

回答

12
  1. 如果Service和Activity类在同一个包中,我相信他们应该能够访问相同的私有存储空间。

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

  3. 将数据捆绑到Intent的额外项中作为键值对并启动活动。


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"); 
+6

如果两者都不在同一个包装中,该怎么办? – Nirav 2011-12-10 13:15:03

+2

@Nirav:Intent intent = new Intent(this,com.example.somepackage.SecondActivity.class); – 2014-07-07 10:24:25

5

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

从服务中,通知用户,使用NotificationManager。你可以将一个可序列化的对象从你的服务传递给一个intent,然后传递给开始的activity,但我建议改为传递一个db ID。

我们已经构建了一个新的Android ORM工具,您可以使用它。它包括可用于构建应用程序的原型Activity和Service类。我还没有一个使用该服务的示例应用程序,但我将在下一个代码中进行编码并尽快完成。

看看...

http://ormlite.com/

而且我的博客?

http://touchlabblog.tumblr.com/

我目前正在做一些相当沉重的分贝的东西,在我工作的应用程序。服务会检查服务器是否有更新,并基本上做你想要做的事情。它的所有非常简单的东西。

+1

更新!我创建了一个示例应用程序,其中包含一个“执行”的服务。我还没有把它放到svn仓库中,但是你可以下载它并且给它旋转。小心。没有“关闭”按钮的服务... http://www.kagii.com/downloads/NotifyService.tar.gz – 2010-09-20 01:42:01