关于Android服务的低内存

时间:2014-08-07 08:29:50

标签: android

我需要确认我在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();停止服务也是正确的过程,在这种情况下,警报管理器会在指定时间后正确重启服务吗?

2 个答案:

答案 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。

尽管,根据您的应用程序的不同,在系统内存的关键条件下,仍然有可能该服务被终止并且不会立即重新启动。