Сервис перестает работать через некоторое время на реальном устройстве (> 40 минут) работает на эмуляторе - PullRequest
2 голосов
/ 02 ноября 2011

Друзья,

Я создал фоновый сервис для Android, который вызывается каждые 2 минуты.Когда он вызван, он начинает прослушивать для LocationUpdates для GPS и NETWORK в течение 40 секунд.Извлечение полезной информации (широта, долгота, точность, провайдер ...) и отправка данных на сервер.

Когда я запускаю приложение на эмуляторе, оно работает нормально.(Ну, я не получаю реальную информацию GPS, только значения по умолчанию всех переменных, но я знаю, что моя служба вызывается каждые две минуты и отправляет данные на сервер)

Поэтому, когда я запускаю приложение нареальное устройство, его работа идеально подходит для 40 минут.Тогда, я думаю, что-то закрывает мой сервис.(может быть, сам Android из-за памяти и т. д.)

Кто-нибудь знает, как я могу отследить ошибку, или даже что может быть этой ошибкой?:

                       private Runnable mUpdateTimeTask = new Runnable() {
    public void run() {
        Log.i(ctx.getString(R.string.app_name),
                "HUJIDataCollectionService, mUpdateTimeTask1 start");
        setuplistenerandrequestupdates();
        mHandler.removeCallbacks(mUpdateTimeTask);
//!     Log.i(ctx.getString(R.string.app_name),"HUJIDataCollectionService, mUpdateTimeTask stop");
    }
};
private Runnable mUpdateTimeTask2 = new Runnable() {
    public void run() {
        Log.i(ctx.getString(R.string.app_name),"HUJIDataCollectionService, mUpdateTimeTask2 start");
        // Send Data to Server here!!
        sendDataToServer();
        // Remove LocationUpdates here!!!
        managerS.removeUpdates(listenerS);
        mHandler.removeCallbacks(mUpdateTimeTask2);
//!     Log.i(ctx.getString(R.string.app_name),"HUJIDataCollectionService,  mUpdateTimeTask2 stop");
    }
};

private TimerTask startServiceTask = new TimerTask() {
    @Override
    public void run() {
        Log.i(ctx.getString(R.string.app_name),"HUJIDataCollectionService, startServiceTask, run()1");

        // Start Locationupdates here!!!!

        longitude = 0;
        latitude = 0;
        locationprovider = "";
        locationproviderConverted = 0;
        locationAccuracy = 100000;
        // remove old updates from timer tasks
        mHandler.removeCallbacks(mUpdateTimeTask);
        mHandler.removeCallbacks(mUpdateTimeTask2);


        mHandler.postDelayed(mUpdateTimeTask, 1000);

        mHandler.postDelayed(mUpdateTimeTask2,
                conf_LocationUpdatePeriodInSec * 1000);


    }

};

@Override
public void onStart(Intent intent, int startId) {
    super.onStart(intent, startId);
//! Log.i(ctx.getString(R.string.app_name),"HUJIDataCollectionService, onStart");

    ShowNotification();

    LoadPreferences();
    startDataCollectionServiceIntervallTimer = new Timer(
            "HUJIDataCollectionServiceStartTimer");

    startDataCollectionServiceIntervallTimer.schedule(startServiceTask,
            1000L, conf_sampleTimeInMin * 60 * 1000L);
    // Starting StopTimer(Thread) to stop listening for location updates
    mHandler = new Handler();


}


           private void setuplistenerandrequestupdates() {

//! Log.i(ctx.getString(R.string.app_name),"HUJIDataCollectionService, setupListenerAndRequestUpdates");
    managerS = (LocationManager) ctx
            .getSystemService(Context.LOCATION_SERVICE);

//! Log.i(ctx.getString(R.string.app_name), "HUJIDataCollectionService, 1");
    listenerS = new LocationListener() {

        @Override
        public void onStatusChanged(String arg0, int arg1, Bundle arg2) {

        }

        @Override
        public void onProviderEnabled(String arg0) {

        }

        @Override
        public void onProviderDisabled(String arg0) {

        }

        @Override
        public void onLocationChanged(Location location) {

            // storing data from the latest location update
            float tempLocLongitude = (float) location.getLongitude();
            float tempLocLatitude = (float) location.getLatitude();
            float tempLocAccuracy = location.getAccuracy();
            String tempLocProvider = location.getProvider();

            //Log.i(ctx.getString(R.string.app_name),
            //      "HUJIDataCollectionService, setupListenerAndRequestUpdates, location Changed");

            // if accuracy of new location is better than existing, store
            // accuracy,latitude,longitude and location provider
            if ((tempLocAccuracy < locationAccuracy)
                    && (tempLocAccuracy != 0.0)) {

                // store current latitude
                latitude = tempLocLatitude;
                // store current longitude
                longitude = tempLocLongitude;
                // store current provider
                locationprovider = tempLocProvider;
                // store current accuracy
                locationAccuracy = (int) tempLocAccuracy;
                // converts the String value of locationprovider to the
                // required integer value for the server
                convertLocationProvider();

            }
        }

    };

Большое спасибо, ребята !!!

Ответы [ 2 ]

4 голосов
/ 02 ноября 2011

Возможно, Android убивает ваш сервис из-за того, что он живет слишком долго и потребляет слишком много ресурсов.

Если вы считаете, что пользователь будет высоко ценить ваше приложение - поскольку ваше приложение написано, их время автономной работы составит всего пару часов, если они будут поддерживать ваше приложение в рабочем состоянии - используйте startForeground(), чтобы указать Android, что ваш сервис является частью передового пользовательского опыта.

Лично я предлагаю вам пересмотреть работу своего приложения, чтобы вы не потребляли почти столько энергии. Например, проверяйте местоположение каждый час, используя AlarmManager и что-то похожее на мой LocationPoller. Это не только сократит частоту и длительность работы GPS, но и освободит вашу службу из памяти между опросами.

0 голосов
/ 03 июня 2013

Вы также должны использовать:

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    // TODO Your code here or in onStart as you did...

    return START_STICKY;        
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...