首页 > 解决方案 > 如何从活动访问服务的变量

问题描述

我知道为了从活动中访问服务的方法,我们应该绑定服务。

但是如果我们只是想获取服务中一个变量的值,我们可以不绑定就直接访问它吗?

int myActivityVar = myService.myServiceVar;

它有效,但我不确定它是否有任何内存泄漏影响或任何其他问题。

标签: javaandroidservice

解决方案


解决方案

  • Activity发送一个BroadcastReceiverService请求获取数据。

  • Service注册BroadcastReceiver,当接收到来自 的广播消息时Activity,它将准备结果数据并Activity使用ResultReceiver将其发送回。

执行

我的服务.java

public class MyService extends Service {

    public static final String ACTION_GET_DATA = "ACTION_GET_DATA";
    public static final String EXTRA_RECEIVER = "EXTRA_RECEIVER";
    public static final String EXTRA_DATA = "EXTRA_DATA";

    public static final int RESULT_OK = 1;
    public static final int RESULT_FAILED = 0;

    // The data of the Service that the Activity want to access.
    private int myServiceVar = 100;

    private final BroadcastReceiver onGetDataReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            // Send result data to the activity
            ResultReceiver receiver = intent.getParcelableExtra(EXTRA_RECEIVER);
            Bundle resultData = new Bundle();
            resultData.putInt(EXTRA_DATA, myServiceVar);
            receiver.send(RESULT_OK, resultData);
        }
    };

    @Override
    public void onCreate() {
        super.onCreate();
        registerReceiver(onGetDataReceiver, new IntentFilter(ACTION_GET_DATA));
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        // TODO: Your code logic goes here.
        return Service.START_STICKY;
    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
}

MainActivity.java

private void getDataFromService() {
    Handler mainHandler = new Handler(Looper.getMainLooper());
    ResultReceiver receiver = new ResultReceiver(mainHandler) {
        @Override
        protected void onReceiveResult(int resultCode, Bundle resultData) {
            if (resultCode == MyService.RESULT_OK) {
                int data = resultData.getInt(MyService.EXTRA_DATA);
                Log.i(TAG, "Received data = " + data);
            }
        }
    };

    Intent intent = new Intent(MyService.ACTION_GET_DATA);
    intent.putExtra(MyService.EXTRA_RECEIVER, receiver);
    sendBroadcast(intent);
}

推荐阅读