0

背景

我目前正在编写一个 android 应用程序并且遇到了一些我无法弄清楚的事情。

我有 3 个Intent,主要的启动意图,显示实时 gps 和加速度计数据的意图,以及显示收集的 gps 和加速度计数据的摘要的意图。

我遇到的问题是,当我切换方向时,重新创建意图以以不同的方向显示,从而调用构造函数,onCreateonStart导致onResume我的内部变量被重置,或者重新实例化并使用 GPS/Sensor apis 注册导致很多的不良数据。

我不想锁定屏幕方向,因为这只是一个 hack 修复,而不是正确解决问题的真正修复。

我曾尝试通过重载来创建服务IntentService,但这是在我停止理解 android 如何操作其服务之前,以及如果 android 中的服务实际上是其他任何地方的服务。

第一次(错误)尝试

public class GPSLoggingService extends IntentService {

public GPSLoggingService() {
    super("GPSLoggingService");

}

@Override
protected void onHandleIntent(Intent wi) {

问题

我将如何拥有一个以相同方式存在的类,该类允许我将计时、GPS 和传感器日志记录移动到后台服务,并使用来自意图的该服务的 api 来显示数据,并保留数据单独处理方向变化以及可能隐藏并带回前台的意图。

我如何让这个服务在应用程序启动时自动运行并持续到应用程序关闭。我将如何在此服务中创建 api?我是否只是在服务中创建方法并根据我的意图调用这些方法?或者是否有我必须使用的消息传递系统?

4

1 回答 1

0

您使用服务的想法是正确的,我建议您阅读谷歌文档,因为它非常好。您最终要寻找的是绑定服务,您应该将其绑定到应用程序上下文而不是活动上下文。例如

public class BoundService extends Service {
    private final BackgroundBinder _binder = new BackgroundBinder();

    public IBinder onBind(Intent intent) {
        return _binder;
    }


    public class BackgroundBinder extends Binder {
        public BoundService getService() {
            return BoundService.this;
        }
    }
}

public class BoundServiceUser extends Activity {
    private BoundService _boundService;
    private boolean _isBound;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        init();
    }

    private void init() {
        //The background Service initialization settings
        Intent intent = new Intent(this, BoundService.class);
        bindService(intent, _serviceConnection, Context.BIND_AUTO_CREATE);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();

        if (_isBound)
            unbindService(_serviceConnection);
    }

    private ServiceConnection _serviceConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName className, IBinder service) {
            BoundService.BackgroundBinder binder = (BoundService.BackgroundBinder)service;
            _boundService = binder.getService();
            _isBound = true;

            //Any other setup you want to call. ex.
            //_boundService.methodName();
        }

        @Override
        public void onServiceDisconnected(ComponentName arg0) {
            _isBound = false;
        }
    };
}

例如,我已将服务绑定到我的 Activity 上下文;由于您希望服务与您的应用程序一起启动和停止,因此您需要扩展 Application 类以绑定和启动您的服务。

如果您将服务存储为公共变量(或使用 getter),那么您应该能够将其作为单例访问(我不是单例的忠实粉丝,但它最适合此类问题)。从那里您可以像访问任何其他类一样访问服务中的方法。

如果您有任何需要澄清的问题,请告诉我。

于 2013-11-12T22:02:44.887 回答