service---七月十九号实验
1 startService、bindService
-
startService:即使用户不直接与应用程序交互做的事情。这对应于
Context.startService()
系统安排服务工作的调用 ,直到服务或其他人明确停止它为止。, -
bindService:
Context.bindService()
,它允许与服务建立长期连接以便与服务进行交互。
2 分析生命周期变化
生命周期:
上图中onStart()方法已经弃用;
流程:onCreat—》onStartCommand--》onBind--》onUnbind--》onDestroy
系统可以运行服务有两个原因。
-
如果有人调用,
Context.startService()
那么系统将启动服务(创建它并onCreate()
在需要时调用其方法),然后onStartCommand(Intent, int, int)
使用客户端提供的参数调用其方法。此服务将在此时继续运行,直到Context.stopService()
或被stopSelf()
调用。请注意,对Context.startService()的多次调用不会嵌套(尽管它们会导致多次对onStartCommand()的相应调用),因此无论启动多少次,一旦Context.stopService()或stopSelf停止服务 ; 服务可以使用它们的stopSelf(int)
方法来确保在处理启动的意图之前不停止服务。 -
对于已启动的服务,他们可以决定运行两种主要的操作模式,具体取决于它们从onStartCommand()返回的值:
START_STICKY
用于根据需要显式启动和停止的服务,同时START_NOT_STICKY
或START_REDELIVER_INTENT
用于服务应该只在处理发送给它们的任何命令时保持运行。。
客户端还可以Context.bindService()
用于获取与服务的持久连接。如果服务尚未运行(onCreate()
在执行此操作时调用),这同样会创建服务,但不会调用onStartCommand()。客户端将接收IBinder
服务从其onBind(Intent)
方法返回的 对象 ,允许客户端然后回调该服务。只要建立连接,服务将保持运行(客户端是否保留对服务的IBinder的引用)。通常,IBinder返回的是一个用aidl编写的复杂接口。
通过Demo类继承Service , 实现关于生命周期的方法,新建Activity来调用Service的方法:
-
@Override public void onCreate() { Log.d("Service声明周期", "onCreate: "); super.onCreate(); } @Override public ComponentName startService(Intent service) { Log.d("Service声明周期", "startService: "); return super.startService(service); } @Override public IBinder onBind(Intent intent) { Log.d("Service声明周期", "onBind: "); return null; } @Override public void onRebind(Intent intent) { Log.d("Service声明周期", "onRebind: "); super.onRebind(intent); } @Override public void onDestroy() { Log.d("Service声明周期 ","onDestroy: "); super.onDestroy(); }
启动验证周期:
相关链接: