如何跨多个意图和方向更改来保持类和数据

时间:2013-11-12 19:31:30

标签: java android android-intent

背景

我目前正在编写一个Android应用程序并遇到了一些我无法理解的东西。

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

我遇到的问题是当我切换方向时,意图被重新创建以显示在不同的方向,从而调用构造函数,onCreateonStartonResume导致我的内部变量要重置,或重新实例化并注册GPS /传感器apis会导致大量不良数据。

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

我试图通过重载IntentService来创建服务,但这是我在停止理解android如何操作其服务之前所获得的,并且如果android中的服务实际上是什么服务在其他地方。

第一次(差)尝试

public class GPSLoggingService extends IntentService {

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

}

@Override
protected void onHandleIntent(Intent wi) {

问题

如何让我的课程以同样的方式存在,允许我将时间,GPS和传感器日志记录移动到后台服务,并使用来自意图的服务的api来显示数据,并拥有数据可以单独留在方向更改上,并且可能隐藏意图并将其带回前台。

如何在应用启动时自动运行此服务并持续直到应用关闭。我如何在此服务中创建api?我只是在服务中创建方法并从我的意图中调用它们?或者我必须使用消息系统吗?

1 个答案:

答案 0 :(得分:0)

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

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),那么您应该能够以单例形式访问它(我不是单身人士的忠实粉丝,但它最适合此类问题) 。从那里你可以像任何其他类一样访问服务中的方法。

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