Android:服务自动重启

时间:2014-11-27 07:17:27

标签: android service gps

我正在使用能够持续保存 GPS latlng 的服务

但很多时候服务会自动重启,导致数据丢失......

所以我们可以通过任何方式限制服务重启。或任何想法来解决这个问题。

3 个答案:

答案 0 :(得分:1)

你可以做几件事。 1)分离任何UI生命周期组件,最好使用清单将服务切换到:远程进程。这样,如果您的活动崩溃/被杀,您的服务将保持不受影响,因为它们位于不同的进程中。查看android IPC(当你在不同的进程上使用本地主机上的套接字时,在你的活动和这个服务之间进行通信的简单方法)

<service
    android:name="myName.GPS"
    android:enabled="true"
    android:exported="false"
    android:process=":remote">
</service>

2)使其成为高优先级前台服务(这将创建持久通知)

@Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        //retrieve persisted data here
        final Intent i = new Intent(this, ClassNameOfService.class);
        i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
        final PendingIntent pi = PendingIntent.getActivity(this, 0, i, 0);
        final NotificationCompat.Builder note =
                new NotificationCompat.Builder(this)
                        .setLargeIcon(BitmapFactory.decodeResource(getResources(),R.drawable.icon))
                        .setSmallIcon(R.drawable.icon)
                        .setContentTitle("GPS Running")
                        .setOngoing(true)
                        .setContentIntent(pi);
        startForeground(10001, note.build()); //replace 10001 with whatever id you like
        return super.onStartCommand(intent, flags, startId);
    }

3)优雅地处理onLowMemory,onDestroy等,以便您可以重新启动服务。您可以使用共享的首选项,或创建一个SQL数据库来保存您的数据,具体取决于您的需求。您的服务将在某一点被杀死。所以最好有一个持久性策略。

    @Override
    public void onDestroy() {
    //persist your data here
        super.onDestroy();
}

答案 1 :(得分:1)

  

但很多时候服务会自动重启,导致数据丢失......

如果您遇到的唯一问题是“数据丢失”,那么您可以在persistent ways之一中存储所需的任何数据。例如存储它(SQLite数据库,SharedPreferences)

  

所以我们可以通过任何方式限制服务重新启动。

假设您有充分的理由这样做,我认为情况并非如此 - 当您开始时,有一种方法start service as a foreground service(它将服务与正在进行的不可见的Notification捆绑在一起)前台服务 - 系统为它提供了更多的优先级 - 除非它真的没有任何可用的内存来运行当前的前台应用程序,否则它不会杀死它。

我还有一个感觉,即您的位置检索实施不是最好的方法 - 如果您的应用需要定期接收位置更新,那么您应该使用Google Play location services。您可以将此API与PendingIntent回调一起使用,每当基于您提供给它的参数进行位置更新时,该回调将唤醒您的服务(以及整个过程,如果它被系统停止)。如果您使用此API,则无需担心服务将停止的情况 - 因为Google Play服务流程会在每次有新位置时通知您时唤醒您的服务。

答案 2 :(得分:1)

您可以通过在清单文件中将其添加为

来为服务创建新流程
android:process=":newservice"

服务标签内