0

就代码而言,我的活动已经变得非常庞大(至少与其他类的繁重相比),所以我希望创建一个简单的帮助类。我想简单地创建一个可以为我实现位置和传感器事件侦听器的类(如 SimpleSessionManager)。有没有办法通过构造函数利用一个简单的类来做到这一点,或者有没有办法将帮助类作为后台活动运行?据我了解,我无法通过扩展 Service 类来实现事件监听器。这个对吗?将它作为一个简单的后台活动运行将是理想的,因为这样我就可以利用 findViewById() 方法,但我似乎无法弄清楚如何让 Listeners 像我希望的那样响应。如果 Fragment 类可以工作,

4

1 回答 1

0

对于实用程序类,我会使用单例模式。例如,您可以设置一个 LocationController 来监听位置更新,并且任何活动都可以只向单例询问最后一个位置。这是一小段代码,向您展示我的意思。

public class LocationController implements LocationListener {

    private static LocationController defaultController;

    public static LocationController getDefaultController(Context applicationContext) {
        if(defaultController == null) {
            defaultController = new LocationController();            

            LocationManager lm = applicationContext.getSystemService(Context.LOCATION_SERVICE);

            lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 30 * 1000, 1000, this);
        }

        return defaultController;
    }

    private Location lastLocation;

    private LocationController() {
    }

    @Override
    public void onLocationChanged(Location location) {
        lastLocation = location
    }

    public Location getLastLocation() {
        return lastLocation;
    }

}

在活动中使用:

public void onCreate(Bundle SavedInstanceState) {
    setContentView(R.layout.mylayout);

    Location lastLocation = LocationController.getDefaultController(getApplicationContext()).getLastLocation();

}

我只是以位置为例,但单例对于您可能希望从应用程序中的多个活动中访问的内容非常有用。因为 Android 已经为您提供了非常好的位置管理器服务,所以我可能不会在您的应用程序中使用它,但这取决于您。此模式可用于多种类型的侦听器和数据模型。要记住的一件事是使用应用程序上下文而不是活动上下文。您不想将活动上下文用于此类事情,因为它会导致您泄漏活动并占用内存。

使用此模式要注意的另一件事是记住关闭位置更新。只要 Android 没有从内存中删除您的应用程序,这将继续接收位置更新。这意味着即使您的应用程序可能未处于活动状态,因此不关心位置更新,它仍会每 30 秒请求一次更新。这是一个非常糟糕的用户体验,因为它会很快耗尽他们的电池。

于 2013-09-25T00:20:51.043 回答