Bagaimana saya bisa menggunakan getSystemService di kelas non-aktivitas (LocationManager)?

181

Saya mengalami kesulitan membongkar tugas dari metode Kegiatan OnCreate utama ke kelas lain untuk melakukan tugas berat.

Ketika saya mencoba memanggil getSystemService dari kelas non-Activity, sebuah pengecualian dilemparkan.

Setiap bantuan akan sangat dihargai :)

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
sumber
2
Menambahkan pengecualian dan menumpuk jejak ke pertanyaan dapat membantu penjawab potensial
Bert F
Hai, maaf atas kesalahannya. Pengecualian dilemparkan jika saya mencoba memperluas kelas Activity dengan yang ini. Saya tidak ingin memperluas kelas Activity untuk kelas ini dan hanya ingin dapat memanggil getSystemService dari dalam metode getLocation saya. Pengecualian: java.lang.IllegalStateException: Layanan sistem tidak tersedia untuk Aktivitas sebelum onCreate ()
Kevin Parker

Jawaban:

280

Anda perlu meneruskan konteks Anda ke kelas fyl Anda ..
Salah satu solusinya adalah membuat konstruktor seperti ini untuk fylkelas Anda :

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

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

       --
 }
}

Jadi di kelas aktivitas Anda buat objek fyl dalam onCreatefungsi seperti ini:

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
sumber
Maaf saya tidak mengerti, kode akan lebih membantu. Jika ada sesuatu yang saya harus melewati objek LocationManager ke metode getLocation ... Saya tidak benar-benar melihat bagaimana saya menyampaikan konteks ke metode ini akan membantu ketika saya bahkan tidak bisa memanggil getSystemService tanpa menulis kelas ini sebagai kelas tambahan untuk Activity.
Kevin Parker
apakah kamu mencoba ini Di onCreate jika Anda melewati akses konteks dengan 'ini'
Labeeb Panampullan
tetapi jika lmtkelas tidak akan dieksekusi maka flytidak akan memiliki konteks
Hunt
BTW getSysytemService()hanya menerima Stringsebagai parameter. Karenanya Anda tidak dapat memberikan konteks padanya. Bagaimana saya mengatasi ini? @Hunt
Parth Sane
2
Hanya untuk menyebutkan, manajer Android ( BluetoothManager, ActivityManagerdll.) Juga dibangun dengan cara itu (tidak harus menyampaikan Activitykonteks kepada konstruktor mereka) dan inilah mengapa mereka dapat mengakses komponen dalam cakupan aplikasi.
Eido95
47

Anda bisa melakukannya untuk ini:

getActivity().getSystemService(Context.CONNECTIVITY_SERVICE);
Maddy
sumber
5
Metode getActivity () tidak terdefinisi untuk kelas. Kesalahan ini muncul.
Darpan
Apa tipe kelas yang Anda gunakan? yaitu kelas penerima, fragmen, kelas java sederhana atau lainnya.
Maddy
Anda perlu memperluas Aktivitas Anda dengan FreagmentActivity alih-alih sebuah Aktivitas. Saya harap ini akan berhasil untuk Anda ...?
Maddy
Itu tidak berfungsi untuk kelas sederhana di mana saya ingin memperpanjang ArrayAdapter.
David Silva-Barrera
2
MIne bekerja dengan menggunakan getContext () alih-alih getActivity ()!
Amir
16

Salah satu cara saya mendapatkan ini adalah dengan membuat kelas statis untuk instance. Saya banyak menggunakannya di AS3. Saya telah bekerja sangat baik untuk saya dalam pengembangan android juga.

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

Anda kemudian dapat mengakses konteksnya atau dengan menggunakan Config.context

LocationManager locationManager;
String context = Context.LOCATION_SERVICE;
locationManager = Config.context.getSystemService(context);
brenjt
sumber
4
Masalah yang saya lihat dengan metode ini adalah ia meninggalkan sesuatu yang tidak terlindungi sehingga, jika seseorang menetapkan nol untuk itu, mungkin akan menghasilkan kegagalan bencana?
Rob
2
Variasi untuk ini adalah dengan meletakkan static privat di MyApp, dan kemudian menambahkan getter. private static MyApp _context; public static MyApp getContext() { return _context; }... di onCreate: _context = this; di OnStop: _context = null;... Penggunaan: MyApp.getContext().
ToolmakerSteve
2
Mungkin menyebabkan kebocoran memori
Yat3s
2
Ini benar-benar akan menyebabkan kebocoran memori. Idealnya Anda tidak harus menggunakan proses ini.
pemula
0

Saya tidak tahu apakah ini akan membantu, tetapi saya melakukan ini:

LocationManager locationManager  = (LocationManager) context.getSystemService(context.LOCATION_SERVICE);
Ruchir Baronia
sumber
Cara yang benar adalah dengan menggunakan dengan cara statis, seperti @Maddy kata
russellhoff
0

Untuk beberapa kelas non-aktivitas, seperti Worker , Anda sudah diberikan objek Konteks di konstruktor publik.

Worker(Context context, WorkerParameters workerParams)

Anda bisa menggunakan itu, misalnya, menyimpannya ke variabel Konteks pribadi di kelas (katakanlah, mContext), dan kemudian, misalnya

mContext.getSystenService(Context.ACTIVITY_SERVICE)
auspicious99
sumber