Java 如何跨多个意图和方向更改持久化类和数据

Java 如何跨多个意图和方向更改持久化类和数据,java,android,android-intent,Java,Android,Android Intent,背景 我目前正在编写一个android应用程序,遇到了一些我不太明白的事情 我有3个意图,主要的启动意图,一个显示实时gps和加速计数据的意图,以及一个显示收集的gps和加速计数据摘要的意图 我遇到的问题是,当我切换方向时,会重新创建以不同方向显示的意图,从而调用构造函数、onCreate、onStart和onResume,从而重置我的内部变量,或者重新实例化并注册GPS/传感器API,导致大量不良数据 我不想锁定屏幕方向,因为这只是一个黑客补丁,而不是一个真正的解决问题的补丁 我曾试图通过重载

背景

我目前正在编写一个android应用程序,遇到了一些我不太明白的事情

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

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

我不想锁定屏幕方向,因为这只是一个黑客补丁,而不是一个真正的解决问题的补丁

我曾试图通过重载
IntentService
来创建一个服务,但在我停止了解android如何操作其服务,以及android中的服务是否真的与其他任何地方的服务一样之前,我已经做到了这一点

第一次(错误)尝试

public class GPSLoggingService extends IntentService {

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

}

@Override
protected void onHandleIntent(Intent wi) {
问题

我将如何创建一个类,该类以同样的方式存在,允许我将计时、GPS和传感器记录移动到后台服务,并使用该服务中的api从意图显示数据,并且在方向改变时不显示数据,并且可能将意图隐藏并带回前台


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

您使用服务的想法是正确的,我建议您通读,因为它非常好。最后,您需要的是一个绑定服务,您应该将它绑定到应用程序上下文,而不是活动上下文。比如说

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

我已将该服务绑定到示例的活动上下文;由于您希望服务随应用程序启动和停止,因此您需要扩展应用程序类以绑定和启动服务

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


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

当应用程序离开时(后退按钮或主页按钮,或切换到其他应用程序),什么是关闭服务的干净方法?我想不起来:由于应用程序没有onDestroy方法,您可以尝试在服务中保留活动计数。->当一个活动启动时,在“活动”中递增递减。当计数达到0时,则解除绑定。我很确定我在某处有更好的方法,但我现在没法看。
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;
        }
    };
}