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;
    }
}

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);
    }
}

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);

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);

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);

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)
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.