如何将数据服务传递给活动?

23 浏览
0 Comments

如何将数据服务传递给活动?

我有三个类

1.MenuActivity

2.LocationUpdateService

3.MultipleMarker

1.MenuActivity

@Override
    protected void onStart() {
        super.onStart();
        bindService(new Intent(this, LocationUpdatesService.class), mServiceConnection,
                Context.BIND_AUTO_CREATE);
    }

2.LocationUpdateService:(这是一个服务类)

private void sendMessageToActivity(Location l, String msg) {
        Intent intent = new Intent("GPSLocationUpdates");
        // You can also include some extra data.
        intent.putExtra("Status", msg);
        Bundle b = new Bundle();
        b.putParcelable("Location", l);
        intent.putExtra("Location", b);
        LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
        Toast.makeText(context, "发送数据到广播接收器", Toast.LENGTH_LONG).show();
    }

3.MultipleMarker(活动类)

LocalBroadcastManager.getInstance(this).registerReceiver(
                mMessageReceiver, new IntentFilter("GPSLocationUpdates"));
 private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            // Get extra data included in the Intent
            String message = intent.getStringExtra("Status");
            Bundle b = intent.getBundleExtra("Location");
            Log.d("messagesshow","****** "+message);
           Location   lastKnownLoc = (Location) b.getParcelable("Location");
            if (lastKnownLoc != null) {
                Log.d("messagesshow","*****    "+String.valueOf(lastKnownLoc.getLatitude()));
            }
             Toast.makeText(context, "数据接收器被调用", Toast.LENGTH_SHORT).show();
        }
    };

我的问题是:当我打开MenuActivity时,我的Toast消息打印发送数据到广播接收器,然后点击按钮后,我调用MultipleMarker.class,但我不能从服务中获取值...但是当我按下返回按钮时,我重新定向到MenuActivity时,我会获得值...

我想从我的LocationUpdateservice类中获取数据,并在我的MultipleMarker.class活动中使用...

0
0 Comments

如何将数据服务传递给活动?

问题的出现原因:

在Android开发中,有时候需要将数据从服务传递给活动。然而,直接在活动中访问服务的数据是不可能的,因为服务和活动运行在不同的线程中。因此,需要一种方法将服务的数据传递给活动。

解决方法:

为了解决这个问题,可以通过创建一个接口并遵循以下步骤来获取服务的引用:

1. 在LocationUpdateService类中添加以下属性:

public class LocationUpdateService extends Service{
    // Binder是一个内部类
    public class LocalBinder extends Binder {
        // Binder作为一个返回服务的方法
        public LocationUpdateService getService() {
            return LocationUpdateService.this;
        }
    }
    private final IBinder mBinder = new LocalBinder();
}

2. 然后在MenuActivity类中添加以下代码:

public class MenuActivity extends AppCompatActivity {
    private LocationUpdateService mService;
    // 连接服务的接口
    private ServiceConnection mConnection = new ServiceConnection() {
        // 当活动连接到服务时调用
        public void onServiceConnected(ComponentName className, IBinder service) {
        // 在这里获取服务
            mService = ((LocationUpdateService.LocalBinder)service).getService();
        }
        // 当服务断开连接时调用
        public void onServiceDisconnected(ComponentName className) {
            mService = null;
        }
    };
}

3. 然后,在bindService()方法中调用onServiceConnected()方法,通过这个方法可以获取服务的实例。需要注意的是,onServiceConnected()方法是异步调用的,因此不能在调用bindService()方法之后立即使用服务的方法,否则会出现NullPointerException。

4. 在活动的onDestroy()方法中,不要忘记调用unbindService(mConnection)来解除服务的绑定。

通过以上步骤,就可以将数据服务传递给活动,并在活动中使用服务的数据。这种方式可以实现服务和活动之间的数据传递,并解决了线程间的访问问题。

0