GetSystemService'i etkinlik dışı bir sınıfta (LocationManager) nasıl kullanabilirim?


181

Ben ağır kaldırma yapmak için başka bir sınıfa ana Activities OnCreate yönteminden görevleri boşaltma sorun yaşıyorum.

Activity olmayan sınıftan getSystemService çağırmaya çalıştığımda bir istisna atılır.

Herhangi bir yardım büyük mutluluk duyacağız :)

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
Soruna istisna ve yığın izlemesi eklemek potansiyel cevaplayıcılara yardımcı olabilir
Bert F

Merhaba, Hata için özür dilerim. Activity sınıfını bu sınıfla genişletmeye çalışırsam istisna atılır. Bu sınıf için Activity sınıfını genişletmek istemiyorum ve sadece getSystemService'i getLocation yöntemimden çağırabilmek istiyorum. İstisna: java.lang.IllegalStateException: onCreate () öncesindeki Etkinlikler tarafından kullanılamayan sistem hizmetleri
Kevin Parker

Yanıtlar:


281

Bağlamınızı fyl sınıfınıza geçirmeniz gerekiyor.
Bir çözüm fylsınıfınız için böyle bir yapıcı yapmaktır :

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

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

       --
 }
}

Etkinlik sınıfınızda fyl nesnesini şu şekilde işlevde yaratın onCreate:

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

Üzgünüm anlamadım, kod daha yararlı olur. Herhangi bir şey getLocation yöntemine bir LocationManager nesnesi geçmesi gereken ... Bu yöntemi Aktivite için genişletilmiş bir sınıf olarak yazmadan bile getSystemService bile çağıramaz zaman yönteme geçme bana nasıl yardımcı olacağını gerçekten görmüyorum.
Kevin Parker

bunu denedin mi
OnCreate'de geçiyorsanız

ama eğer lmtsınıf idam flyedilmeyecekse o zaman içeriğe sahip olmayacak
Hunt

BTW getSysytemService()sadece Stringparametre olarak kabul eder . Bu nedenle olamaz buna bir bağlam geçmektedir. Bunu nasıl çözebilirim? @Hunt
Parth Sane

2
Sadece belirtmek gerekirse , Android yöneticileri ( BluetoothManager, ActivityManagervb.) De bu şekilde oluşturulur ( yapıcılarına mutlaka bir Activitybağlam aktarması gerekmez ) ve bu yüzden uygulama kapsamındaki bileşenlere erişebilirler.
Eido95

47

Bunun için gidebilirsiniz:

getActivity().getSystemService(Context.CONNECTIVITY_SERVICE);

5
getActivity () yöntemi sınıf için tanımsız. Bu hata ortaya çıkıyor.
Darpan

İçinde kullandığınız sınıf türü nedir? yani bir alıcı sınıfı, fragmanı, basit java sınıfı ya da başka bir sınıftır.
Maddy

Etkinliğinizi Etkinlik yerine FreagmentActivity ile genişletmeniz gerekir. Umarım senin için çalışır ...?
Maddy

Uzatmak istediğim basit bir sınıf için işe yaramıyor ArrayAdapter.
David Silva-Barrera

2
MIne, getActivity () yerine getContext () kullanarak çalıştı!
Amir

16

Ben bu konuda var bir yolu, örnekler için statik bir sınıf oluşturmaktır. AS3'te çok kullandım, android geliştirmede de benim için harika çalıştı.

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

Daha sonra içeriğe veya Config.context

LocationManager locationManager;
String context = Context.LOCATION_SERVICE;
locationManager = Config.context.getSystemService(context);

4
Bu yöntemle gördüğüm sorun korumasız bir şey bırakıyor, eğer birisi ona null atayacaksa, muhtemelen felaketli bir başarısızlık yaratacaktır?
Rob

2
Bunun bir varyasyonu, Uygulamama özel bir statik koymak ve sonra alıcıları eklemektir. private static MyApp _context; public static MyApp getContext() { return _context; }... onCreate içinde: _context = this; OnStop in: _context = null;... Kullanım: MyApp.getContext().
ToolmakerSteve

2
Belki de bellek sızıntısına neden olabilir
Yat3s

2
Bu kesinlikle bellek sızıntısına yol açacaktır. İdeal olarak bu işlemi kullanmamalısınız.
acemi

0

Bunun yardımcı olup olmayacağını bilmiyorum, ama bunu yaptım:

LocationManager locationManager  = (LocationManager) context.getSystemService(context.LOCATION_SERVICE);

@Maddy'nin dediği gibi, doğru yol statik bir şekilde kullanmaktır
russellhoff

0

İşçi gibi bazı etkinlik dışı sınıflar için, genel kurucuda zaten bir Bağlam nesnesi verilir.

Worker(Context context, WorkerParameters workerParams)

Bunu sadece örneğin, örneğin sınıftaki özel bir Bağlam değişkenine kaydedebilirsiniz (örneğin, mContext) ve sonra örneğin

mContext.getSystenService(Context.ACTIVITY_SERVICE)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.