我需要确认我在onLowMemory服务方法中采取的步骤。我有一个粘性的服务。这是startCommand:
@Override
public int onStartCommand(Intent intent, int flags, int startId)
{
// TODO Auto-generated method stub
initialiseObjects();
setChatObjects();
return Service.START_STICKY;
}
这是OnLowMemory方法:
@Override
public void onLowMemory() {
// TODO Auto-generated method stub
super.onLowMemory();
System.gc();
Intent restartService = new Intent(getApplicationContext(),
this.getClass());
restartService.setPackage(getPackageName());
PendingIntent restartServicePI = PendingIntent.getService(
getApplicationContext(), 1, restartService,
PendingIntent.FLAG_ONE_SHOT);
AlarmManager alarmService = (AlarmManager)getApplicationContext().getSystemService(Context.ALARM_SERVICE);
alarmService.set(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime() +1000, restartServicePI);
this.stopSelf();
}
请检查并帮我确认我是否以正确的方式进行此操作。我是否必须使用警报管理器重新启动服务,否则它将自动重启,因为它是一个粘性服务?设置警报后使用this.stopSelf();
停止服务也是正确的过程,在这种情况下,警报管理器会在指定时间后正确重启服务吗?
答案 0 :(得分:1)
也许您可以覆盖应用程序的onLowMemory()而不是服务onLowMemory()。
public class MyApplication extends Application {
@Override
public void onLowMemory() {
super.onLowMemory();
stopService(new Intent(getApplicationContext(), MyService.class));
startService(new Intent(getApplicationContext(), MyService.class));
}
}
希望这有帮助。
答案 1 :(得分:0)
虽然回答有点晚,但它仍然可以帮助其他人,也可以帮助像Android开发这样的新人,所以我分享我的理解。
首先,不建议手动使用'System.gc()',系统会自动收集垃圾,即当堆时将调用'System.gc()'尺寸将达到极限。手动调用它可能会使应用在相当长的时间内运行缓慢。此视频介绍了内存管理,还简要介绍了'System.gc()'Memory management for Android Apps
第二,是的,如果服务在此后不久返回 START_STICKY 并且您不需要警报管理器,则该服务将自动重新启动。
第三,是的,正如我检查的那样,这可以正确停止服务。但是,由于 START_STICKY
,由于该服务将自动重启,因此可能不需要Alarm Manager。尽管,根据您的应用程序的不同,在系统内存的关键条件下,仍然有可能该服务被终止并且不会立即重新启动。