0

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

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

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

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

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

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

4

2 回答 2

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);

希望这可以帮助你!干杯

于 2012-10-03T23:30:34.847 回答
0

看来我的应用程序应该包含一个活动和活动绑定到的服务。

不必要。您可以为此使用命令模式。

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

不必要。您可以为此使用命令模式。

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

使用 启动服务startService()。它是否会存活 24 小时不在您的控制之下(请参阅 Dyarish 的回答,将其设为前台服务,这增加了它存活那么久的几率)。

于 2012-10-05T15:32:12.523 回答