关于android:如何将Activity绑定到Service并从Activity控制和管理Service
How to bind an Activity to a Service and control and manage the Service from the Activity
我正在尝试将 Activity 绑定到 LocalService 以与之交互。但是在我的 Activity 中,我只能调用 LocalBinder 中定义的方法,而不能调用 LocalService 中定义的方法。我做错了什么?
没有从头开始我阅读了另一个问题,并且我已经阅读了一些如何编写一些示例代码的内容,我的代码类似于该示例代码。此外,为了方便起见,我一直在阅读一些服务文档,这里是文档该部分的一小段引述:
"当应用程序组件通过调用 bindService() 绑定到服务时,服务被"绑定"。绑定服务提供客户端-服务器接口,允许组件与服务交互、发送请求、获取结果,甚至执行所以通过进程间通信(IPC)跨进程。绑定的服务只有在另一个应用程序组件绑定到它时才会运行。多个组件可以一次绑定到服务,但是当它们全部解除绑定时,服务就会被销毁。"
但我不能那样做。如上所述,我能做的最好的事情就是在我的 LocalBinder 中定义我的 Activity 调用方法。我没有像上面黑色突出显示的部分那??样取得任何成就。
如果有帮助,这里是我的代码的相关部分。
要绑定的LocalService:
/**************************************************************************************************
* Filename: LocalService.java * Project name: Local Service Sample * Application name: Local Service * Description: This file contains the LocalService (extends Service) for our Local Service app **************************************************************************************************/ package com.marie.localservicesample; import java.io.IOException; import android.app.Notification; public class LocalService extends Service { // Unique Identification Number for the Notification. // just some arbitrary numbers for test purposes // I get my Extras from onStartCommand and use in ServiceWorker() thread public static final String EXTRA_MESSENGER ="com.marie.localservicesample.EXTRA_MESSENGER"; private static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"); Boolean stop_receive_data = false; // This is the object that receives interactions from clients. See @Override @Override // Display a notification about us starting. We put an icon in the status bar. // Call this at the end of onStartCommand() after we got the Extras /* BluetoothAdapter btAdapter = BluetoothAdapter.getDefaultAdapter(); // reset the bluetooth device StringBuffer strBuffer = new StringBuffer(""); int ndxPlus = 0; while (data != -1) { if (data == 63) { // send data to the handler to plot the data strBuffer = new StringBuffer(""); data = btIstream.read(); } } catch (IOException e1) { LocalService.this.stopSelf(); @Override Bundle extras = intent.getExtras(); messenger = (Messenger)extras.get(EXTRA_MESSENGER); afterStartCommand(); // We want this service to continue running until it is explicitly @Override /** // Set the icon, scrolling text and timestamp // The PendingIntent to launch our activity if the user selects this notification // Set the info for the views that show in the notification panel. // Send the notification. |
绑定到 LocalService 的活动:
/**************************************************************************************************
* Filename: Binding.java * Project name: Local Service Sample * Application name: Local Service * Description: This file contains the Binding class for our Local Service application **************************************************************************************************/ package com.marie.localservicesample; import android.app.Activity; /* public class Binding extends Activity { private ServiceConnection mConnection = new ServiceConnection() { int statusCode = mBoundService.getStatusCode(); Log.d("Binding.java","called onServiceConnected. statusCode:" + statusCode); Toast.makeText(Binding.this, R.string.local_service_connected, public void onServiceDisconnected(ComponentName className) { Log.d("Binding","called onServiceDisconnected"); Toast.makeText(Binding.this, R.string.local_service_disconnected, void doBindService() { void doUnbindService() { // Tell the user we did an unbind // Detach our existing connection. @Override setContentView(R.layout.local_service_binding); // Watch for button clicks. private OnClickListener mBindListener = new OnClickListener() { private OnClickListener mUnbindListener = new OnClickListener() { @Override |
我的 ILocalBinder 和 LocalBinder:
/**************************************************************************************************
* Filename: ILocalBinder.java * Project name: Local Service Sample * Application name: Local Service * Description: This file contains an example interface for my LocalBinder **************************************************************************************************/ package com.marie.localservicesample; public interface ILocalBinder { public int getStatusCode(); /************************************************************************************************** package com.marie.localservicesample; import android.os.Binder; import com.marie.localservicesample.LocalService; /** } |
谢谢!
参见本地服务示例。
只需将它们拥有的 binder 类代码复制到您的服务中,而不是为其创建单独的文件:(在 LocalService 类声明中)
public class LocalService {
// This is the object that receives interactions from clients. See // RemoteService for a more complete example. private final IBinder mBinder = new LocalBinder(); /** ... |
然后:
public void onServiceConnected(ComponentName className, IBinder service) {
// This is called when the connection with the service has been // established, giving us the service object we can use to // interact with the service. Because we have bound to a explicit // service that we know is running in our own process, we can // cast its IBinder to a concrete class and directly access it. mBoundService = ((LocalService.LocalBinder)service).getService(); |
现在您可以使用 mBoundService 直接访问您的服务。
相关讨论
- 你能帮我解决这个问题吗stackoverflow.com/questions/51508046/...