Como posso usar getSystemService em uma classe de não atividade (LocationManager)?

181

Estou tendo problemas ao descarregar tarefas do método principal do Activities OnCreate para outra classe para fazer o trabalho pesado.

Quando tento chamar getSystemService da classe não Activity, uma exceção é lançada.

Qualquer ajuda seria muito apreciada :)

lmt.java:

package com.atClass.lmt;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
import android.location.Location;

public class lmt extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        fyl lfyl = new fyl();
        Location location = lfyl.getLocation();
        String latLongString = lfyl.updateWithNewLocation(location);

        TextView myLocationText = (TextView)findViewById(R.id.myLocationText);
        myLocationText.setText("Your current position is:\n" + latLongString);
    }
}

fyl.java

package com.atClass.lmt;

import android.app.Activity;
import android.os.Bundle;
import android.location.Location;
import android.location.LocationManager;
import android.os.Bundle;
import android.widget.TextView;
import android.content.Context;

public class fyl {
    public Location getLocation(){
        LocationManager locationManager;
        String context = Context.LOCATION_SERVICE;
        locationManager = (LocationManager)getSystemService(context);

        String provider = LocationManager.GPS_PROVIDER;
        Location location = locationManager.getLastKnownLocation(provider);

        return location;
    }

    public String updateWithNewLocation(Location location) {
        String latLongString;

        if (location != null){
            double lat = location.getLatitude();
            double lng = location.getLongitude();
            latLongString = "Lat:" + lat + "\nLong:" + lng;
        }else{
            latLongString = "No Location";
        }

        return latLongString;
    }
}
Kevin Parker
fonte
2
Adicionando a exceção e pilha de rastreamento para a questão pode ajudar os potenciais respondentes
Bert F
Oi, desculpe pelo erro. A exceção é lançada se eu tentar estender a classe Activity com esta. Não quero estender a classe Activity para essa classe e simplesmente quero chamar getSystemService de dentro do meu método getLocation. Exceção: java.lang.IllegalStateException: serviços do sistema não disponíveis para atividades antes de onCreate ()
Kevin Parker

Respostas:

280

Você precisa passar seu contexto para sua classe fyl.
Uma solução é criar um construtor como este para sua fylclasse:

public class fyl {
 Context mContext;
 public fyl(Context mContext) {
       this.mContext = mContext;
 }

 public Location getLocation() {
       --
       locationManager = (LocationManager)mContext.getSystemService(context);

       --
 }
}

Portanto, em sua classe de atividade, crie o objeto fyl in onCreatecomo este:

package com.atClass.lmt;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
import android.location.Location;

public class lmt extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        fyl lfyl = new fyl(this); //Here the context is passing 

        Location location = lfyl.getLocation();
        String latLongString = lfyl.updateWithNewLocation(location);

        TextView myLocationText = (TextView)findViewById(R.id.myLocationText);
        myLocationText.setText("Your current position is:\n" + latLongString);
    }
}
Labeeb Panampullan
fonte
Desculpe, não entendi, o código seria mais útil. Se alguma coisa eu deveria passar um objeto LocationManager para o método getLocation ... Na verdade, não vejo como passar o contexto para o método ajudará quando não posso nem chamar o getSystemService sem escrever essa classe como uma classe estendida para Activity.
Kevin Parker
você tentou isso? No onCreate, se você está passando, acesse o contexto por 'this'
Labeeb Panampullan 02/02
mas se a lmtclasse não vai conseguir executado então flynão vai ter contexto
Caça
BTW getSysytemService()aceita apenas Stringcomo parâmetro. Portanto, você não pode passar um contexto para ele. Como contornar isso? @Hunt
Parth Sane
2
Só para citar, gerentes Android ( BluetoothManager, ActivityManageretc.) também são construídos dessa maneira (não necessariamente passar um Activitycontexto para seu construtor) e é por isso que eles podem acessar componentes no escopo do aplicativo.
Eido95 # 9/16
47

Você pode fazer isso:

getActivity().getSystemService(Context.CONNECTIVITY_SERVICE);
Maddy
fonte
5
O método getActivity () é indefinido para a classe. Este erro aparece.
Darpan
Qual é o tipo de classe em que você está usando? ou seja, é uma classe receptora, fragmento, classe java simples ou qualquer outra.
Maddy
Você precisa estender sua atividade com FreacementActivity em vez de uma atividade. Espero que funcione para você ...?
Maddy
Não funciona para uma classe simples em que eu quero estender ArrayAdapter.
David Silva-Barrera
2
MIne trabalhou usando getContext () em vez de getActivity ()!
Amir
16

Uma maneira de contornar isso é criar uma classe estática para instâncias. Eu o usei bastante no AS3. Também funcionou muito bem para mim no desenvolvimento do Android.

Config.java

public final class Config {
    public static MyApp context = null;
}

MyApp.java

public class MyApp extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Config.context = this;
    }
    ...
}

Você pode acessar o contexto ou usando Config.context

LocationManager locationManager;
String context = Context.LOCATION_SERVICE;
locationManager = Config.context.getSystemService(context);
brenjt
fonte
4
O problema que vejo neste método é que deixa algo desprotegido que, se alguém atribuísse nulo a ele, provavelmente produziria uma falha catastrófica?
Rob
2
Uma variação disso é colocar uma estática privada no MyApp e adicionar getters. private static MyApp _context; public static MyApp getContext() { return _context; }... em onCreate: _context = this; em onStop: _context = null;... Uso: MyApp.getContext().
Página
2
É talvez levar a vazamento de memória
Yat3s
2
Isso absolutamente levará ao vazamento de memória. Idealmente, você não deve usar esse processo.
Iniciante
0

Não sei se isso vai ajudar, mas fiz o seguinte:

LocationManager locationManager  = (LocationManager) context.getSystemService(context.LOCATION_SERVICE);
Ruchir Baronia
fonte
O caminho certo é usar de maneira estática, como @Maddy diz
russellhoff 15/03
0

Para algumas classes que não são de atividade, como Worker , você já recebe um objeto Context no construtor público.

Worker(Context context, WorkerParameters workerParams)

Você pode simplesmente usar isso, por exemplo, salve-o em uma variável Context privada na classe (digamos mContext) e, em seguida, por exemplo

mContext.getSystenService(Context.ACTIVITY_SERVICE)
auspicious99
fonte