标签:lis 客户 text out demo indicator blocks 分享 public
Android之Service的生命周期和启动方式的特点比较:
Service是Android系统中的四大组件之一,它和Activity的级别差不多,但是只能在后台运行,并且可以和其他的组件进行交互。Service可以在很多场合的应用中使用,例如播放音乐的时候用户启动了其它的Activity这个时候程序要在后台继续播放,比如在后台记录地理位置信息的改变等等,总之服务是在后台运行的。
<!-- 进行注册服务 --> <service android:name=".MyService"></service>
3. 定义一个类继承Service类
一、start启动服务的特点:
1 public class MyService extends Service { 2 public static final String tag = "start方式开启服务---"; 3 4 @Override 5 public boolean onUnbind(Intent intent) { 6 Log.e(tag, "onUnbind"); 7 return super.onUnbind(intent); 8 } 9 @Override 10 //第一次创建时调用 11 public void onCreate() { 12 Log.e(tag, "onCreate"); 13 super.onCreate(); 14 } 15 16 //启动服务时调用 17 @Override 18 public int onStartCommand(Intent intent, int flags, int startId) { 19 Log.e(tag, "onStartCommand"); 20 return super.onStartCommand(intent, flags, startId); 21 } 22 23 //销毁服务时调用 24 @Override 25 public void onDestroy() { 26 Log.e(tag, "onDestroy"); 27 super.onDestroy(); 28 } 29 }
//第一次点击按钮开启服务的时候
10-23 15:09:57.487 29774-29774/com.example.lenovo.servicedemo E/start方式启动服务---﹕ onCreate
10-23 15:09:57.487 29774-29774/com.example.lenovo.servicedemo E/start方式启动服务---﹕ onStartCommand
//之后再点击开启按钮开启服务,只执行onStartCommand()
10-23 15:10:04.547 29774-29774/com.example.lenovo.servicedemo E/start方式启动服务---﹕ onStartCommand
//点击按钮stopService之后服务销毁 或者是在设置-> 应用程序 -> 正在运行 中手动把该服务停止的之后执行onDestory销毁服务
10-23 15:10:06.921 29774-29774/com.example.lenovo.servicedemo E/start方式启动服务---﹕ onDestroy
二、Bind绑定服务:
BindService是应用组件(客户端)通过调用bindService()方法能够绑定服务,然后Android系统会调用服务的onBind()回调方法,这个方法会返回一个跟服务端交互的IBinder对象。这个绑定是异步的,bindService()方法立即返回,并且不给客户端返回IBinder对象。要接收IBinder对象,客户端必须创建一个ServiceConnection类的实例,并且把这个实例传递给bindService()方法。ServiceConnection对象包含了一个系统调用的传递IBinder对象的回调方法。注意:只有Activity,Service和内容提供者(Content Provider)能够绑定服务,广播接收器不能绑定服务。
bind服务的特点:
1 public class MyService extends Service { 2 public static final String tag = "bind方式开启服务---"; 3 4 @Override 5 //创建服务时调用 6 public void onCreate() { 7 Log.e(tag, "onCreate"); 8 super.onCreate(); 9 } 10 11 //绑定服务的时候调用 12 @Override 13 public IBinder onBind(Intent intent) { 14 return null; 15 } 16 17 @Override 18 public boolean onUnbind(Intent intent) { 19 Log.e(tag, "onUnbind"); 20 return super.onUnbind(intent); 21 } 22 23 //销毁服务时调用 24 @Override 25 public void onDestroy() { 26 Log.e(tag, "onDestroy"); 27 super.onDestroy(); 28 } 29 30 }
//第一次点击bind服务的按钮
10-23 15:35:02.301 18879-18879/com.example.lenovo.servicedemo E/bind方式开启服务---﹕ onCreate
10-23 15:35:02.301 18879-18879/com.example.lenovo.servicedemo E/bind方式开启服务---﹕ onBind
//第二次点击bind按钮没有响应
//点击unbind解绑服务,服务销毁
10-23 15:35:05.251 18879-18879/com.example.lenovo.servicedemo E/bind方式开启服务---﹕ onUnbind
10-23 15:35:05.251 18879-18879/com.example.lenovo.servicedemo E/bind方式开启服务---﹕ onDestroy
//再次点击解绑,即多次解绑服务报错
10-23 15:35:17.121 18879-18879/com.example.lenovo.servicedemo E/AndroidRuntime﹕ FATAL EXCEPTION: main
java.lang.IllegalArgumentException: Service not registered: com.example.lenovo.servicedemo.MainActivity$MyConn@429ee820
为什么要引入bindService:目的是为了调用服务里面的方法
//服务里面定义一个方法方法,之后需要在Activity里面调用 public void serviceMethod(){ Toast.makeText(getApplicationContext(), "这是服务里面的方法", Toast.LENGTH_SHORT).show(); }
//定义一个类继承 IBinder接口的实现子类Binder类 class MyBinder extends Binder { public void callServiceMethod(){ serviceMethod(); } }
//绑定服务的时候调用 @Override public IBinder onBind(Intent intent) { return new MyBinder(); //返回一个MyBinder对象 }
class MyConn implements ServiceConnection{ @Override public void onServiceConnected(ComponentName name, IBinder service) { binder = (MyService.MyBinder)service; //获取MyBinder对象 } @Override public void onServiceDisconnected(ComponentName name) { } }
public void onClickCallMethod(){ binder.callServiceMethod(); }
interface IService { public void callServiceMethod2(); }
//服务里面定义一个方法方法,之后需要在Activity里面调用 public void serviceMethod(){ Toast.makeText(getApplicationContext(), "这是服务里面的方法", Toast.LENGTH_SHORT).show(); } public void serviceMethod2(){ Toast.makeText(getApplicationContext(), "这是服务里面想暴露的方法", Toast.LENGTH_SHORT).show(); } //定义一个类继承 IBinder接口的实现子类Binder类 class MyBinder extends Binder implements IService{ public void callServiceMethod(){ serviceMethod(); } @Override public void callServiceMethod2() { serviceMethod2(); } }
binder = (IService) service;
音乐播放器(需要混合方式开启服务):
需求:既想让服务在后台长期运行,又想调用服务里面的方法
bindService:不能长期运行,但是可以调用方法
startService:可以长期运行, 但是不可以调用方法
标签:lis 客户 text out demo indicator blocks 分享 public
原文地址:http://www.cnblogs.com/denluoyia/p/5987021.html