Android基础----Service
来源:互联网 发布:c语言预处理指令放在哪 编辑:程序博客网 时间:2024/05/20 22:26
简介:
Service是和Activity相类似的应用组件,他们都是一个可以自行的程序,最大的区别就在于Activity是有界面显示的,而Service是不需要界面显示的,其是运行在后台的服务。所以Service常用于处理不需要交互界面的一些任务,例如后台播放器播音乐等任务。
基本用法:
实现一个自定义的Service类,继承自系统的Service类,并实现其中的方法
在AndroidManifest.xml文件中注册自定义的Service
通过两种方式来启动Service
由于Service有着两种不同的启动方式,随着启动方式的不同,其生命周期和使用特性也有所不一样,所以我们分别来看这两种启动方式的Service。
通过startService()启动Service
1. 自定义一个Service类,并实现其中需要的的方法
public class MyService extends Service { //在Service创建时调用 @Override public void onCreate() { super.onCreate(); } //使用stratService()启动时调用 @Override public int onStartCommand(Intent intent, int flags, int startId) { return super.onStartCommand(intent, flags, startId); } //销毁时调用 @Override public void onDestroy() { super.onDestroy(); } //在startService()这种启动方式中没有用 @Nullable @Override public IBinder onBind(Intent intent) { return null; }}
2. 在AndroidManifest.xml文件中注册Service
<!----注册一个Service><service android:name=".MyService"> <!----配置相应的intent过滤器> <intent-filter > <action android:name="com.wei.review_service.START_SERVICE" /> </intent-filter>
3. 通过startService()来启动
//声明intentIntent intent = new Intent();//为intent指定actionintent.setAction("com.wei.review_service.START_SERVICE");//启动ServicestartService(intent);//停止ServicestopService(intent);
通过bindService()启动Service
1. 自定义一个Service,并实现其中的方法
public class MyService extends Service { private int count; private MyBinder binder = new MyBinder(); //当Service创建时调用 @Override public void onCreate() { super.onCreate(); } //当Service被绑定时调用(必须实现) @Nullable @Override public IBinder onBind(Intent intent) { return binder; } //当Service解除绑定时调用 @Override public boolean onUnbind(Intent intent) { return super.onUnbind(intent); } //当Service销毁时调用 @Override public void onDestroy() { super.onDestroy(); } /** * 通过继承Binder类来实现IBinder */ public class MyBinder extends Binder{ public int getCount(){ return count; } }}
2. 在AndroidManifest.xml文件中注册Service
<service android:name=".MyService"> <intent-filter > <action android:name="com.wei.review_service.START_SERVICE" /> </intent-filter></service>
通过bindService()方法来启动Service
//声明一个Binder引用 MyService.MyBinder myBinder; //声明一个ServiceConnection实例 ServiceConnection serviceConnection = new ServiceConnection() { //当Service被绑定时调用,并返回Service中的Binder实例 @Override public void onServiceConnected(ComponentName name, IBinder service) { myBinder = (MyService.MyBinder) service; } //当Service解除绑定时调用 @Override public void onServiceDisconnected(ComponentName name) { //实现当service断开连接时需要处理的业务 } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //绑定Service bindService(new Intent("com.wei.review_service.START_SERVICE"), serviceConnection, BIND_AUTO_CREATE); //解除绑定 unbindService(serviceConnection); }
两种启动方式的异同:
通过startService()来启动Service,Service和启动它的Activity之间没有关联,只有当调用stopService()或者是被系统清理掉时才会停止,不会因为Activity的退出而结束生命周期。缺点是无法和Service进行交互,当启动一个Service后就只能让Service自己运行。
通过bindService()方法启动Service,其生命周期是和启动它的Activity绑定在一起的,当Activity退出时Service也会自动的结束生命周期。优点是可以通过Binder来实现和Service的交互,可以控制Service的运行情况。
两中启动方式的生命周期图:
两种启动方式混合使用:
之前被人问到说要是两种启动方式混合使用Service生命周期怎么表示,当是简直是一脸懵逼。。
同时使用两种方式来启动同一个Service,我们可以分情况来看一下:
首先不论启动多少次Service,其都只会调用一次onCreate方法,在调用完onCreate方法之后就需要分情况来讨论:
若是先startService,再bindService
- 首先调用onCreate,然后是onStartCommand ,在点击bindService之后会调用onBind()。
- 若是要停止Service时,先点击stopService已经没有效果了,无法停止Service,要先unbindService,然后会调用unbind方法,最后onDestyoy
若是先bindService,然后在startService
- 首先调用onCreate,然后是onBind,在点击startService之后调用onStartCommand 。
- 若是要停止Service时,同样的stopService无法起作用,要先unbindService之后,才会调用onUnBind和onDestroy
结论:
在启动时: Service的onCreate方法只会执行一次,只要service已经启动了,那么就不会再次执行onCreate方法,两种启动方式会调用其专有的生命周期函数。
在停止时: 无论两种启动方式谁先谁后,只要service被bind过,那么在结束时就需要先把service解除绑定,完了之后才会调用结束的方法。
IntentService:
因为Service并不是一条专门的线程,而且他还和他所在的应用在同一进程内,所以不宜在Service中做太多耗时的任务,会阻塞主线程,容易引起ANR(若Service在20s内无反应就会报ANR)。IntentService是Service的一个子类,其被设计用于处理这些问题。
IntentService会单独的创建worker线程来处理所有的Intent请求,而且会创建单独的worker线程来处理onHandleIntent()方法实现的代码,在处理完成请求之后会自动停止,同时对onBind()和onStartCommand()方法提供了默认实现,,只需要实现其处理业务的onHandleIntent()方法即可。
public class MyIntentService extends IntentService { /** * Creates an IntentService. Invoked by your subclass's constructor. * * @param name Used to name the worker thread, important only for debugging. */ public MyIntentService(String name) { super(name); } @Override protected void onHandleIntent(Intent intent) { //实现需要处理的业务,IntentService已经完成了对于多线程的支持,所以不会阻塞主线程 }}
系统中的Service:
我们可以通过getSystemService()在Activity中获取有用的系统服务。
1. TelephonyManager:
电话管理器可以用于管理手机通话状态,电话网络信息的服务类。他提供了众多的方法可以对手机的状态进行查看。
TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
2. SmsManager:
短信管理器可以用于管理短信的发送和接收。
SmsManager smsManager = SmsManager.getDefault();
3. AudioManager:
音频管理器可以用于处理系统的音量等事物。
AudioManager audioManager = (AudioManager) getSystemService(Service.AUDIO_SERVICE);
4. Vibrator:
振动器管理器可以管理手机振动的相关功能,实现对振动器的处理。
Vibrator vibrator = (Vibrator) getSystemService(Service.VIBRATOR_SERVICE);
5. AlarmManager:
闹钟管理器可以管理手机的闹钟服务,或者是一个全局的定时器。
AlarmManager alarmManager = (AlarmManager) getSystemService(Service.ALARM_SERVICE);
- Android基础 : Android Service
- Android基础 : Android Service
- Android基础之Service
- Android (一) Service基础
- Android基础之Service
- 【Android】Service基础学习
- android service基础
- Android基础------Service服务
- Android--Service之基础
- Android--Service之基础
- android Service基础
- Android--Service之基础
- Android基础--Service应用
- Android基础service简介
- [Android基础]Service
- android的service基础
- Android Service基础
- Android Service 基础详解
- shell变量---特殊变量
- 运营商劫持ajax请求
- SDK和JDK区别
- 无限轮播+小圆点
- mysql&numa&swap
- Android基础----Service
- 用移位实现两个整数的除法
- Java虚拟机层面的几种锁
- JAVA 堆栈 堆 方法区 静态区 final static 内存分配 详解
- 不是人人都懂的学习方法
- iOS开发实现两个APP间的跳转
- 动态编译执行代码
- IO流的使用
- Git简单实用教程(一)-Git简介