отключить самостоятельно включенный gps по нажатию кнопки

 
 
 
Сообщения:9
сорри, название темы плохое.
суть следующая. у меня есть некий код, который жрет ресурсы процессора, как я понимаю из-за работы гпс. нужно научиться работу гпс по кнопки останавливать.
gps у меня запускается в main activity в oncreate. код следующий:
        LocationManager locationManager =  (LocationManager) MainActivity.this.getSystemService(Context.LOCATION_SERVICE);
        LocationListener locationListener = new LocationListener() {

            public void onLocationChanged(Location location) {
                // Called when a new location is found by the network location provider.
                MainActivity.lat = Double.toString(location.getLatitude());
                MainActivity.lon = Double.toString(location.getLongitude());
                MainActivity.bea = Double.toString(location.getBearing());
                MainActivity.spe = Double.toString(location.getSpeed());
                MainActivity.mes = "      <coordinates>" + lat + "," + lon + "</coordinates>" + "\r\n";
                //Log.d(MainActivity.TAG, "а местонахождение-то поменялось!");
            }
        };
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);

в том же main activity есть
    public void buttonOnClick(View v) {
        Button button = (Button)findViewById(R.id.button);
}

в котором надо сделать, как я понимаю
            LocationManager locationManager =  (LocationManager) MainActivity.this.getSystemService(Context.LOCATION_SERVICE);
            locationManager.removeUpdates(locationListener);

потому что в первой строчке мы получаем ссылку, указатель (не знаю как еще назвать) на некий уже существующий объект.
но во второй - оно требует locationListener, и как я понимаю, это должен быть старый locationlistener? но к нему обратиться я не смогу?

скорее всего я переделаю так, чтобы по нажатию кнопки гпс стартовал, а по повторному - отключался, тогда и проблем с доступом по идее не будет. но в моей первоначальной постановке никак не получится?
 
 
Сообщения:652
нифига не понял.
Тебе надо сервис останавливать или листенер удалить? Так то дергание листененров не должно ресурсы есть.

Я только учусь
 
 
Сообщения:9
сервис я вроде остановил (он по инету шлет чототам) - и вроде как вот этим кодом
private boolean isMyServiceRunning(Class<?> serviceClass) {
        ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
        for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
            if (serviceClass.getName().equals(service.service.getClassName())) {
                Log.i ("isMyServiceRunning?", true+"");
                return true;
            }
        }
        Log.i ("isMyServiceRunning?", false+"");
        return false;
    }

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

но во вкладке "батарейка" мое приложение оказалось жрало амперы.
я посмотрел, прикинул, и вроде как от постоянного опроса гпс оно наверное и идет (вроде там не рекомендуют его постоянно включенным оставлять)

короче, пока сделал так, что объявил листенер в самом начале класса, а в onCreate задал его, и в onButtonClick его же смог использовать.
вроде скомпилировалось без ошибок, на смартфон еще не загружал.
 
 
Сообщения:652
puff:
сервис я вроде остановил (он по инету шлет чототам) - и вроде как вот этим кодом
private boolean isMyServiceRunning(Class<?> serviceClass) {

Если ты этим кодом сервис останавливаешь, то у меня плохие новости... Сервис останавливается чем то вроде
boolean stopService(Class<?> serviceClass)

И чего это метод опроса сервиса приватный?

Я только учусь
 
 
Сообщения:9
задумывался для использования внутри класса, зачем его делать публичным?

но это не оно - опять за ночь высадило батарейку.. получается, сервис не отключается?
а на старых api (4.4.4) и profiler не запустить. печаль...
 
 
Сообщения:9
подозреваю, что сам нагородил фигню в том месте, где сервис запускаю/глушу:
MainActivity.this.startService(new Intent(MainActivity.this, MyService.class));
MainActivity.this.stopService(new Intent(MainActivity.this,MyService.class));

то есть каждый раз создается новый инстанс интента? или как?
 
 
Сообщения:652
puff:
то есть каждый раз создается новый инстанс интента? или как?

смотря что прописано в самих методах. Предположительно да.

Я только учусь
 
 
Сообщения:9
в том-то и дело, что вроде ничего крамольного...
locationListener = new LocationListener() {

            public void onLocationChanged(Location location) {
                // Called when a new location is found by the network location provider.
                MainActivity.lat = Double.toString(location.getLatitude());
                MainActivity.lon = Double.toString(location.getLongitude());
                MainActivity.bea = Double.toString(location.getBearing());
                MainActivity.spe = Double.toString(location.getSpeed());
                MainActivity.alt = Double.toString(location.getAltitude());
                long millis = System.currentTimeMillis();
                long seconds = millis / 1000;
                seconds = seconds + (1969*365*24*60*60);
                MainActivity.mes = ","+lat+","+lon+",\r\n";
            }

            public void onStatusChanged(String provider, int status, Bundle extras) {
                Log.d(MainActivity.TAG, "некий статус поменялся");
            }
            public void onProviderEnabled(String provider) {
                Log.d(MainActivity.TAG, "включили гпс?");
            }
            public void onProviderDisabled(String provider) {
                Log.d(MainActivity.TAG, "отключили гпс?");
            }
        };

или речь о чем-то другом? попробую завтра собрать приложение под что-нибудь посвежее, чтоб profiler посмотреть.
 
 
Сообщения:652
puff:
вроде ничего крамольного...
не вижу самой реализации
puff:
MainActivity.this.startService(new Intent(MainActivity.this, MyService.class));
например.

Я только учусь
 
 
Сообщения:9
а. речь о классе?
    public static class MyService extends IntentService {
        public MyService() {
            super("MyService");
        }
        @Override
        protected void onHandleIntent(Intent intent) {
            int tm = intent.getIntExtra("time", 0);
            Log.d(MainActivity.TAG, "onHandleIntent");
            final int port = 50008;
            Socket s = null;
            Socket s1 = null;
            try {
                Log.d(MainActivity.TAG, "Trying to create a socket!");
                s = new Socket("192.168.1.18",port);
                s1 = new Socket("192.168.1.18",50009);
                Log.d(MainActivity.TAG, String.format("connecting to port = %d", port));
                OutputStream out = s.getOutputStream();
                OutputStream gpsout = s1.getOutputStream();
                PrintWriter output = new PrintWriter(out);
                PrintWriter gpsoutput = new PrintWriter(gpsout);
                byte byte1=10;
                byte byte2=55;
                byte byte3=56;

                while (MainActivity.isServiceRunning) {
                    try {
                        TimeUnit.MILLISECONDS.sleep(700);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    output.write(byte1);
                    output.write(byte2);
                    output.write(byte3);
                    output.flush();
                    gpsoutput.write(MainActivity.mes);
                    gpsoutput.flush();
                }
            } catch(IOException e) {
                Log.d(MainActivity.TAG, e.toString());
                PrintWriter output = null;
                PrintWriter gpsoutput = null;
                s = null;
                s1 = null;
            }
        }
    }

примерно так. причем да, вопрос так и остался нерешенным. когда-то там в этом while был просто whilte (true)
я думал, что раз мы делаем stopService - это означает, что и код внутри стопится. но он не стопился - пакетты так и продолжали идти, хотя isMyServiceRunning вроде как сообщал то, что вроде бы и ожидалось (true - когда сервис запускали, и false, когда отключали). с ним по какой-то причине не вышло. в итоге сделал MainActivity.isServiceRunning, которую и меняю по нажатию кнопки.
то есть вот этот жизненный цикл класса мне не совсем ясен (какого рожна он продолжал работать, когда его самого уже вроде как и нету.
есть мысль обернуть этот while в другой, и после него засыпать, например, на секунду (если этот onHandleIntent продолжает запускаться непрерывно - хотя я сейчас подумал, вроде бы в логах-то ничего и не было в этот момент. а должно бы было быть.
 
 
Сообщения:652
В общем, надо больше уделить внимания принципам ООП. Есть класс, есть инстанс класса, ака объект. Работаешь ты с объектом а смотришь на него с точки зрения класса.... Это разные понятия.

Я только учусь
 
 
Сообщения:9
был бы очень признателен, если бы ткнули меня носом. о чень речь - работаю с объектом, а смотрю на него с точки зрения класса?

попробовал вчера запустить на андроиде посвежее - и вовсе не удалось установить (похоже, какие-то фичи ми или сборка не под тот API, хз, разбираться еще и с этим времени не было)

а на моем смарте оно активно сажает батарейку даже когда сервис вроде бы отключен.

PS javatalks смог открыть только через vpn, хз почему.
Изменен:20 мая 2018 10:49
 
Модераторы:frymock
Сейчас эту тему просматривают:Нет