我的应用程序的服务架构

时间:2012-10-03 22:12:50

标签: android service

我有一个应用程序,通过使用locationlistener创建面包屑来跟踪手机的位置。用户可以启动应用程序,然后启动痕迹跟踪记录。该路径显示在应用程序中的谷歌地图上作为旅行记录。面包屑也被发送到一个clout数据库,其他应用程序可以访问正在进行的旅行。

用户可以结束应用,但选择保持面包屑记录,以便其他应用仍然可以实时跟踪。如果用户永远不回来停止录制,录制将从开始播放24小时后停止。但是,用户可以随时启动应用程序并停止记录跟踪。

我的应用程序似乎应该包含活动所绑定的活动和服务。没有其他应用程序将使用此服务,因此似乎服务不应该是IPC服务。该服务执行所有位置监听和记录到云数据库。

我的问题是,在1226页的CommonsWare书中,它说如果我的应用程序调用unbindService(),android将关闭该服务。我希望它继续运行,直到活动关闭它或者它在24小时后自行关闭。

这是否意味着我的服务必须是IPC服务?

如何结束我的活动并让服务保持运行? 谢谢,加里

2 个答案:

答案 0 :(得分:1)

首先,您希望将服务作为前台服务。

有些事情。 (我将在您的服务onCreate函数中调用此代码。)

    Notification notification = new Notification(
            R.drawable.ic_dialog_info,
            getText(R.string.notification_text),
            System.currentTimeMillis());
    notification.flags |= Notification.FLAG_AUTO_CANCEL;

    Intent activityIntent = new Intent(this, YourMainClass.class);
    activityIntent.setAction(Intent.ACTION_MAIN);
    activityIntent.addCategory(Intent.CATEGORY_LAUNCHER);
    activityIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP
            | Intent.FLAG_ACTIVITY_SINGLE_TOP);

    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0,
            activityIntent, 0);
    notification.setLatestEventInfo(this,
            getText(R.string.notification_title),
            getText(R.string.notification_text), pendingIntent);
    startForeground(123, notification);

另一件事是不要将您的服务绑定到您的活动。如果您的活动被杀,您不希望您的服务也死亡。如果你的设备内存不足,如果你的活动不在前台,那么它就是被杀的候选人。当然,当内存释放时,Android会尝试重新创建它。但是你的用户体验会很糟糕。如果您的服务没有绑定到您的活动并且是前台,那么它应该是在垃圾收集期间被操作系统杀死的最后一件事。

您可以使用这段简单的代码启动服务而不将其绑定到您的活动:此代码可以在您的活动onCreate中调用。

Intent service = new Intent(YourContext, YourService.class);
startService(service);

希望这会对你有所帮助! 干杯

答案 1 :(得分:0)

  

我的应用程序似乎应该包含活动所绑定的活动和服务。

不一定。您可以使用命令模式。

  

这是否意味着我的服务必须是IPC服务?

不一定。您可以使用命令模式。

  

如何结束我的活动并让服务继续运行?

使用startService()启动服务。它是否会活24小时不在你的控制范围内(参见Dyarish的答案,它使它成为一个前台服务,这增加了它将存活的可能性很长)。