背景
我目前正在编写一个Android应用程序并遇到了一些我无法理解的东西。
我有3个Intent
,主要启动意图,显示实时gps和加速度计数据的意图,以及显示收集的gps和加速度计数据的总结的意图。
我遇到的问题是当我切换方向时,意图被重新创建以显示在不同的方向,从而调用构造函数,onCreate
,onStart
和onResume
导致我的内部变量要重置,或重新实例化并注册GPS /传感器apis会导致大量不良数据。
我不想锁定屏幕方向,因为这只是一个黑客修复而不是正确解决问题的正确修复。
我试图通过重载IntentService
来创建服务,但这是我在停止理解android如何操作其服务之前所获得的,并且如果android中的服务实际上是什么服务在其他地方。
第一次(差)尝试
public class GPSLoggingService extends IntentService {
public GPSLoggingService() {
super("GPSLoggingService");
}
@Override
protected void onHandleIntent(Intent wi) {
问题
如何让我的课程以同样的方式存在,允许我将时间,GPS和传感器日志记录移动到后台服务,并使用来自意图的服务的api来显示数据,并拥有数据可以单独留在方向更改上,并且可能隐藏意图并将其带回前台。
如何在应用启动时自动运行此服务并持续直到应用关闭。我如何在此服务中创建api?我只是在服务中创建方法并从我的意图中调用它们?或者我必须使用消息系统吗?
答案 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),那么您应该能够以单例形式访问它(我不是单身人士的忠实粉丝,但它最适合此类问题) 。从那里你可以像任何其他类一样访问服务中的方法。
如果您有任何需要澄清的问题,请告诉我。