我正在使用能够持续保存 GPS latlng 的服务
但很多时候服务会自动重启,导致数据丢失......
所以我们可以通过任何方式限制服务重启。或任何想法来解决这个问题。
答案 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"
服务标签内