android - 与使用 SharedPrefs 或直接获取变量相比,绑定到服务以获取其变量的优势是什么?
问题描述
我有一个有时会在后台运行的服务——从 startService() 开始。绑定到该服务以获取/设置其变量的优势是什么,而不是 - 我知道有争议,但仍然 - 只是直接访问其公共变量(例如 myVar = mainService.itsVar),或使用 SharedPrefs 来设置和得到值?特别是,基于获取间隔大约为 3 秒的事实,就性能而言,最快的是什么?
解决方案
优势 - 您可以直接访问变量和运行方法。缺点 - 分配跨线程头痛,更不用说谷歌开发者控制台上未解决的崩溃。
如何正确地做,我将举一个前台服务的例子,如果它可以是后台那么只改变如何启动它:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
mContext.startForegroundService(startIntent)
} else {
mContext.startService(startIntent);
}
在服务中你需要实现所有的绑定方法:
private IBinder mBinder = new MyBinder();
public MainService() {
}
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
@Override
public void onRebind(Intent intent) {
super.onRebind(intent);
}
@Override
public boolean onUnbind(Intent intent) {
return true;
}
public class MyBinder extends Binder {
public MainService getService() {
return com.xxx.xxx.MainService.this;
}
}
在活动中您需要收听连接:
private ServiceConnection mServiceConnection = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
mBoundService = null;
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Log.d(TAG, "connecting");
MainService.MyBinder myBinder = (MainService.MyBinder) service;
mBoundService = myBinder.getService();
mShouldUnbind.set(true);
}
};
如果其他活动或警报可以启动您的服务,您将需要每隔一秒左右检查一次服务是否由其他人启动并绑定到它。重要 - 服务运行在与主/GUI 线程相同的线程上 - 因此,如果您有相机或上传等耗时操作 - 您将需要启动后台线程。可以通过调用 GUI/主线程来进行反向通信。在像我这样的前台服务上-您还需要管理通知,否则操作系统将在 5 秒后终止该服务。
代码示例:
if (mShouldUnbind.get() && mBoundService != null)
val = mBoundService.getTimestamp();
编辑 I:优势:我有一个摄像头前台服务——我可以直接从 GUI 线程设置缩放值,因为我有服务的句柄。相机在服务的后台线程上运行,但是,由于预览被绘制了 30 次专业秒 - 缩放设置没有任何延迟。您将永远无法以任何其他方式做到这一点。
推荐阅读
- python - 图像处理 - 填充空心圆圈
- android - 如何在 Android Studio 中生成具有自定义名称的输出 APK 文件?
- bash - 使用 google-chrome 从 linux 命令行以编程方式打开/刷新浏览器中的链接
- java - Maven3:如何在自定义 Maven 扩展中获取所有项目依赖项
- javascript - 右键菜单未显示在正确位置
- javascript - 为什么javascript应用函数递归工作?
- android - 其他用户如何不使用 C++ 库?
- c++ - 新连接发送数据后epoll没有通知EPOLLIN事件?
- android - 持卡人验证方法 (CVM) - 来自 APDU 命令的 9F34 标签 - Android
- javascript - 如何从 document.getElementById .setAttribute href 添加按钮或将长 url 更改为其他名称