理解Android Service
来源:互联网 发布:暂停互联网医院知乎 编辑:程序博客网 时间:2024/06/12 06:19
1、 Service的start和bind状态有什么区别?
startService()方式启动,Service是通过接受Intent并且会经历onCreate()和onStart()。当用户在发出
意图使之销毁时会经历onDestroy();而bindService()方式启动,与Activity绑定的时候,会经历onCreate()和onBind(),而当Activity被销毁的时候或者调用主动调用unbindService时,Service会先调用onUnbind()然后是onDestroy()。
注意:通过bindService()方法启动时要在activity的onDestroy()方法中调用unbindService(conn);否则会造成内存泄漏
Activity com.servicedemo.MainActivity has leaked ServiceConnection com.servicedemo.MainActivity$1@a4858f9 that was originally bound here
2、同一个Service,先startService,然后再bindService,如何把它停止掉?
startService(intent_service)和unbindService(conn)都要调用,调用单独一个无效。
3、你有注意到Service的onStartCommand方法的返回值吗?不同返回值有什么区别?
onStartCommand()方法,返回的是一个int整形。
public @StartResult int onStartCommand(Intent intent, @StartArgFlags int flags, int startId) { onStart(intent, startId); return mStartCompatibility ? START_STICKY_COMPATIBILITY : START_STICKY; }
这个整形可以有以下四个取值:
1): START_STICKY_COMPATIBILITY=0:START_STICKY的兼容版本,但不保证服务被kill后一定能重启。
2): START_STICKY=1:如果service进程被kill掉,保留service的状态为开始状态,但不保留递送的intent对象。随后系统会尝试重新创建service,由于服务状态为开始状态,所以创建服务后一定会调用onStartCommand(Intent,int,int)方法。如果在此期间没有任何启动命令被传递到service,那么参数Intent将为null。
3): START_NOT_STICKY=2:“非粘性的”。使用这个返回值时,如果在执行完onStartCommand()后,服务被异常kill掉,系统不会自动重启该服务。
4): START_REDELIVER_INTENT=3:重传Intent。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统会自动重启该服务,并将Intent的值传入。
4、Service的生命周期方法onCreate、onStart、onBind等运行在哪个线程?
onCreate、onStart、onBind都在主线程运行
D/StartService: onCreate--Thread.Name--->mainD/StartService: onStartCommand--Thread.Name--->mainD/BindService: onCreate--Thread.Name--->mainD/BindService: onBind--Thread.Name--->main
start方式启动Service
//start方式启动Service final Intent intent_service = new Intent(MainActivity.this, StartService.class); tvStart.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 启动服务 startService(intent_service); } }); tvStop.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 停止服务 stopService(intent_service); } });
public class StartService extends Service { private final static String TAG = "StartService"; @Nullable @Override public IBinder onBind(Intent intent) { Log.d(TAG,"onBind--Thread.Name--->" +Thread.currentThread().getName()) ; // 仅通过startService()启动服务,所以这个方法返回null即可。 return null; } @Override public void onCreate() { super.onCreate(); Log.d(TAG,"onCreate--Thread.Name--->" +Thread.currentThread().getName()) ; } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.d(TAG,"onStartCommand--Thread.Name--->" +Thread.currentThread().getName()) ; return super.onStartCommand(intent, flags, startId); } @Override public void onStart(Intent intent, int startId) { super.onStart(intent, startId); Log.d(TAG,"onStart--Thread.Name--->" +Thread.currentThread().getName()) ; } @Override public void onDestroy() { super.onDestroy(); Log.d(TAG,"onDestroy") ; }}
调用startService(intent_service);
执行结果
D/StartService: onCreate--Thread.Name--->mainD/StartService: onStartCommand--Thread.Name--->mainD/StartService: onStart--Thread.Name--->main
调用stopService(intent_service);
执行结果
D/StartService: onDestroy
bind方式启动Service
//bind方式启动Service final Intent intent_bind = new Intent(this, BindService.class); // 指定开启服务的action intent_bind.setAction("com.servicedemo.BindService"); tvBind.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 绑定服务到当前activity中 bindService(intent_bind, conn, Service.BIND_AUTO_CREATE); } }); tvUnBind.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { binder = null; unbindService(conn); } });
public class BindService extends Service { private final static String TAG = "BindService"; private int count ; private boolean quit = false ; private Thread thread ; private MyBinder myBinder = new MyBinder() ; public class MyBinder extends Binder{ public int getCount (){ return count ; } } @Nullable @Override public IBinder onBind(Intent intent) { Log.d(TAG,"onBind--Thread.Name--->" +Thread.currentThread().getName()) ; return myBinder; } @Override public void onCreate() { super.onCreate(); Log.d(TAG,"onCreate--Thread.Name--->" +Thread.currentThread().getName()) ; thread = new Thread(new Runnable() { @Override public void run() { // 每间隔一秒count加1 ,直到quit为true。 Log.d(TAG,"quit ="+quit) ; while (!quit){ try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } count++; Log.d(TAG,"count ="+count) ; } } }) ; thread.start(); } @Override public void onStart(Intent intent, int startId) { super.onStart(intent, startId); Log.d(TAG,"onStart--Thread.Name--->" +Thread.currentThread().getName()) ; } @Override public boolean onUnbind(Intent intent) { Log.d(TAG,"onUnbind") ; return true; } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.d(TAG,"onStartCommand") ; return super.onStartCommand(intent, flags, startId); } @Override public void onDestroy() { super.onDestroy(); Log.d(TAG,"onDestroy") ; this.quit = true ; }}
调用bindService(intent_bind, conn, Service.BIND_AUTO_CREATE);
执行结果
D/BindService: onCreate--Thread.Name--->mainD/BindService: onBind--Thread.Name--->mainD/BindService: quit =falseD/MainActivity: onServiceConnectedD/BindService: count =1D/BindService: count =2D/BindService: count =3
调用unbindService(conn);
执行结果
D/BindService: onUnbindD/BindService: onDestroy
- android 理解service服务
- Android 中的 Service理解
- android之service理解
- Android Service 深入理解
- android service简单理解
- android编程-Service理解
- Android service理解
- Android Service生命周期理解
- Android Service onStartCommand 理解
- android service理解
- android service理解
- Android Service个人理解
- 理解Android Service
- 清晰理解 Android Service
- 关于Android-Service的理解
- 理解Android的本地Service和跨进程Service
- Android 中Service简单理解(生命周期)
- Android中Service方式使用的理解
- Lodop云端打印插件配置https
- java.lang.ClassNotFoundException: org.apache.jsp.login_jsp
- 机器学习中的最优化方法进阶
- make之学习笔记
- 搭建第一个scrapy项目的常见问题
- 理解Android Service
- java多线程之线程的安全性(一)
- HDU 5104 Primes Problem(打表)
- 【NOIP2013模拟联考7】最长上升子序列
- Qt学习之路——Qt简介
- Android编译系统
- Ubuntu安装NVIDIA驱动后桌面循环登录
- 深度学习之图像分割 《Fully Convolutional Networks for Semantic Segmentation》—FCN
- Java包(package)命名规则