前者我们必须通过Activity调用onStop来关闭service,如果Activity不管他,小service会一直运行下去,我们希望的是将Activity与Service绑定,实现关闭Activity同时关闭service。
这里需要一个:
public ServiceConnection connect=new ServiceConnection(){
@Override
public void onServiceConnected(ComponentName arg0, IBinder service) {
// TODO Auto-generated method stub
try {
System.out.println("###ServiceConnection Sucess,service is"+service.getInterfaceDescriptor());
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
来管理绑定和解除绑定
现在我们定义service代码:
public class MyService extends Service{ private IBinder mybinder=new IBinder(){ //取得接口描述信息 public String getInterfaceDescriptor() throws RemoteException { // TODO Auto-generated method stub return "MyService.class";//返回service类名称 } @Override public void dump(FileDescriptor arg0, String[] arg1) throws RemoteException { // TODO Auto-generated method stub } @Override public void dumpAsync(FileDescriptor arg0, String[] arg1) throws RemoteException { // TODO Auto-generated method stub } @Override public boolean isBinderAlive() { // TODO Auto-generated method stub return false; } @Override public void linkToDeath(DeathRecipient arg0, int arg1) throws RemoteException { // TODO Auto-generated method stub } @Override public boolean pingBinder() { // TODO Auto-generated method stub return false; } @Override public IInterface queryLocalInterface(String arg0) { // TODO Auto-generated method stub return null; } @Override public boolean transact(int arg0, Parcel arg1, Parcel arg2, int arg3) throws RemoteException { // TODO Auto-generated method stub return false; } @Override public boolean unlinkToDeath(DeathRecipient arg0, int arg1) { // TODO Auto-generated method stub return false; } }; //绑定时触发 public IBinder onBind(Intent intent) { // TODO Auto-generated method stub System.out.println("service:onBind Intent"+intent); return mybinder; } //重新绑定时触发 public void onRebind(Intent intent) { // TODO Auto-generated method stub System.out.println("service:onRebind Intent"+intent); super.onRebind(intent); } //接触绑定时触发 public boolean onUnbind(Intent intent) { // TODO Auto-generated method stub System.out.println("service:onUnbind Intent"+intent); return super.onUnbind(intent); } //创建时触发 public void onCreat(){ System.out.println("service:onCreat "); super.onCreate(); } // public void onCreate() { // System.out.println("****onCreate"); // // } // // @Override // //销毁时触发 public void onDestroy(){ System.out.println("****onDestroy"); } //启动时触发 public int onStartCommand(Intent intent,int flag,int startid){ System.out.println("****onStart Intent"+intent+" flag "+flag+" startid:"+startid); return Service.START_CONTINUATION_MASK; } }
布局函数加两个按钮:
<Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="start" android:text="启动Service" /> <Button android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="stop" android:text="停止Service" /> <Button android:id="@+id/button3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="Bind" android:text="启动绑定" /> <Button android:id="@+id/button4" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="Unbind" android:text="解除绑定" />
Activity:
public class MainActivity extends Activity { public ServiceConnection connect=new ServiceConnection(){ @Override public void onServiceConnected(ComponentName arg0, IBinder service) { // TODO Auto-generated method stub try { System.out.println("###ServiceConnection Sucess,service is"+service.getInterfaceDescriptor()); } catch (RemoteException e) { // TODO Auto-generated catch block e.printStackTrace(); } } @Override public void onServiceDisconnected(ComponentName arg0) { // TODO Auto-generated method stub System.out.println("###ServiceConnection Failure"); } }; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void start(View v){ MainActivity.this.startService(new Intent(MainActivity.this,MyService.class)); } public void stop(View v){ MainActivity.this.stopService(new Intent(MainActivity.this,MyService.class)); } public void Bind(View v){ MainActivity.this.bindService(new Intent(MainActivity.this,MyService.class) ,MainActivity.this.connect,Context.BIND_AUTO_CREATE); } public void Unbind(View v){ MainActivity.this.unbindService(MainActivity.this.connect); } }
按绑定:
接触绑定:
当我突然退出程序的时候:
实例完成,大家课后可以深入思考一下service工作原理
相关推荐
要绑定Service,Activity需要实现`ServiceConnection`接口,并重写`onServiceConnected()`和`onServiceDisconnected()`方法。在`onCreate()`或`onResume()`中调用`bindService()`,传入Service的Intent和自定义的...
本篇文章将深入探讨AIDL的工作原理以及如何绑定Service,帮助开发者理解这两个关键概念。 **AIDL简介** AIDL是一种特殊的接口定义语言,允许不同进程间的Android组件进行通信。当一个应用需要与另一个应用的Service...
2、针对对普通类绑定service进行测试 3、普通类可以绑定service,但是需要activity传入一个Contex参数 4、该测试可以将业务代码和activity或者service分离,实现程序更好的结构,提高代码可读性 5、欢迎大家一起讨论...
在本文中,我们将深入探讨如何在Android应用中绑定Service,这通常用于实现客户端-服务器通信,使得应用程序可以与Service进行交互、传递数据或控制Service的行为。 一、Service生命周期 在理解绑定Service之前,...
本文将深入探讨如何通过绑定Service来进行通信,这在需要与Service交互、获取Service状态或传递数据时非常有用。我们以"ConnectService"为例来详细讲解这个过程。 1. **Service基础概念** Service不同于Activity,...
总结起来,Android应用中的音乐播放器绑定Service,主要是为了实现后台持久播放以及Activity和服务之间的有效通信。Service负责处理音频播放逻辑,而Activity通过绑定Service来控制播放状态。使用`MediaPlayer`或`...
在本例中,我们关注的是通过`BindService`来绑定Service,以及如何利用BroadcastReceiver进行通信,以实现播放音乐的功能。 首先,`BindService`是Android系统提供的接口,允许一个组件(通常是Activity)与Service...
"Android绑定serviceDemo"是专门为演示如何使用bindService方法来启动并交互Service的实例。bindService不同于startService,后者主要用于启动一次性或周期性的任务,而bindService则更强调组件之间的绑定关系,允许...
4. **启动和绑定Service**:在客户端(Activity或其他组件),我们使用bindService()方法启动并绑定Service。需要提供一个Intent来指定要绑定的Service,以及一个ServiceConnection对象,用于处理绑定成功或失败的回...
在Android开发中,Service是应用程序组件之一,它在...务必注意,绑定Service后,记得在适当的时候解绑,以保持应用的正常运行和内存管理。在实际项目中,根据具体需求,可能还需要考虑线程同步、错误处理等复杂情况。
绑定Service的过程涉及到创建一个Intent,指定要绑定的Service类,并通过bindService()方法进行绑定。以下是一个简单的示例: ```java Intent intent = new Intent(this, MyService.class); bindService(intent, ...
本文将深入探讨如何在Android中绑定Service,以及相关知识点。 首先,了解Service的基本概念。Service主要分为两种启动方式:startService()和bindService()。startService()用于启动一个Service并执行一次性任务,...
代码中包含同个应用程序间Service的...Server工程为Service所在的应用程序,Client工程为要绑定Service的应用程序,例子简单易懂,可配合http://blog.csdn.net/u013524014/article/details/50314477 中的介绍帮助理解。
- **绑定Service**:在需要使用Service的Activity中,通过`bindService()`方法来绑定Service,并在回调中获取到`IBinder`对象。 ```java Intent intent = new Intent(this, MyLocalService.class); bindService...
5. **绑定Service**:通过Context的bindService()方法进行绑定,并提供一个实现了ServiceConnection接口的回调对象,用于处理连接成功和断开的情况。 ```java ServiceConnection connection = new ...
`onServiceConnected()` 方法会在服务绑定成功后被调用,此时我们可以通过 `service` 参数访问服务的 `Binder` 对象,并调用其方法。当不再需要服务时,记得调用 `unbindService()` 来解除绑定: ```java // 解绑...
服务端(server)包含了Service的实现以及AIDL接口的定义,而客户端(client)则包含调用服务端Service的方法和绑定Service的逻辑。 总结来说,远程调用Service是Android开发中处理跨进程通信的重要技术。通过AIDL...
- 绑定Service时,确保在Activity的onDestroy()中解绑,防止内存泄漏。 - 如果只是需要在后台执行一次性任务,优先考虑使用IntentService,因为它更易于管理和资源释放。 通过理解和掌握Service与Activity的绑定...
3. **13.MusicPlayerDemo**:可能是结合启动和绑定Service的实例,用来演示如何控制后台音乐播放。它可能包含一个启动服务来持续播放音乐,同时允许客户端通过绑定来控制播放状态。 理解并熟练掌握Service的启动和...
在ServiceProject这个项目中,你可能找到了如何创建、启动和绑定Service的示例代码。研究这些代码,结合上述理论知识,你将能更好地理解Service在Android应用中的作用和使用方式。通过实践,你可以熟练掌握Service...