首页 > 解决方案 > 与使用 SharedPrefs 或直接获取变量相比,绑定到服务以获取其变量的优势是什么?

问题描述

我有一个有时会在后台运行的服务——从 startService() 开始。绑定到该服务以获取/设置其变量的优势是什么,而不是 - 我知道有争议,但仍然 - 只是直接访问其公共变量(例如 myVar = mainService.itsVar),或使用 SharedPrefs 来设置和得到值?特别是,基于获取间隔大约为 3 秒的事实,就性能而言,最快的是什么?

标签: androidvariablesservice

解决方案


优势 - 您可以直接访问变量和运行方法。缺点 - 分配跨线程头痛,更不用说谷歌开发者控制台上未解决的崩溃。

如何正确地做,我将举一个前台服务的例子,如果它可以是后台那么只改变如何启动它:

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 次专业秒 - 缩放设置没有任何延迟。您将永远无法以任何其他方式做到这一点。


推荐阅读