关于Android中的四大组件(Service的开启与关闭)
前言
服务(Service)是Android系统中的四大组件之中的一个。服务主要用于两个目的:后台执行和跨进程訪问。
通过启动
一个服务。能够在不显示界面的前提下在后台执行指定的任务,这样能够不影响用户做其它事情。通过AIDL服务能够
实现不同进程之间的通信,这也是服务的重要用途之中的一个。
Service基础
Service并没有实际界面,而是一直在Android系统的后台执行。一般使用Service为应用程序提供一些服务。或不
须要界面的功能,比例如以下载文件、播放音频等。
怎样创建与配置Service
在日常开发中Service的创建与配置能够依照下面两个步骤进行:
(1)定义一个继承Service的子类。
(2)在AndroidManifest.xml文件里配置该Service。
Service与Activity一样,也有一个启动到销毁的过程。只是这个过程Service要比Activity简单多了。
一个服务实际
上是一个继承自android.app.Service的类。查看Service源代码。能够看出Service实际上是一个抽象类,在这个抽象类
中有一个抽象方法onBind,因此我们在继承一个Service类时。必需要实现这种方法。
- public abstract class Service extends ContextWrapper implements ComponentCallbacks2 {
- .......
- public abstract IBinder onBind(Intent intent);
- .......
- }
以下类定义了一个Service组件。
- public class MyFirstService extends Service{
- public static final String TAG="MyFirstService";
- @Override
- public IBinder onBind(Intent intent) {
- return null;
- }
- @Override
- public void onCreate() {
- super.onCreate();
- Log.e(TAG, "--------onCreate--------");
- }
- @Override
- public int onStartCommand(Intent intent, int flags, int startId) {
- Log.e(TAG, "--------onStartCommand--------");
- return super.onStartCommand(intent, flags, startId);
- }
- @Override
- public void onDestroy() {
- super.onDestroy();
- Log.e(TAG, "--------onDestroy--------");
- }
- }
以上代码完毕了创建Service。接下来须要在AndroidMainfest.xml文件里进行配置该Service,下面配置代码展示了
怎样配置Service:
- <application
- android:allowBackup="true"
- android:icon="@drawable/ic_launcher"
- android:label="@string/app_name"
- android:theme="@style/AppTheme" >
- <activity
- android:name=".MainActivity"
- android:label="@string/app_name" >
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- </activity>
- <service android:name="com.example.servicetest.startservice.MyFirstService" >
- </service>
- </application>
到了这一步我们的Service组件已经创建完成。接着我们能够启动Service了,在Android系统中启动Service有两种
方式,各自是startService和bindService。
startService使用
以下程序通过两个button进行启动与停止Service,演示Service通过startService从创建到销毁整个过程。
- public class MyFirstService extends Service{
- public static final String TAG="MyFirstService";
- @Override
- public IBinder onBind(Intent intent) {
- return null;
- }
- @Override
- public void onCreate() {
- super.onCreate();
- Log.e(TAG, "--------onCreate--------");
- }
- @Override
- public int onStartCommand(Intent intent, int flags, int startId) {
- Log.e(TAG, "--------onStartCommand--------");
- return super.onStartCommand(intent, flags, startId);
- }
- @Override
- public void onDestroy() {
- super.onDestroy();
- Log.e(TAG, "--------onDestroy--------");
- }
- }
两个button的点击事件:
- @Override
- public void onClick(View v) {
- switch (v.getId()) {
- case R.id.btn_startService:// startService
- startService(serviceIntent);
- break;
- case R.id.btn_stoptService:// stopService
- stopService(serviceIntent);
- break;
- default:
- break;
- }
- }
以上是我们创建的Service组件,接下来对Service进行操作。
(1)当单击一次启动(startService)button时:
(2)当服务被启动后单击一次停止(stopService)button时:
从上面能够看出Service从创建到销毁分别经历了 onCreate---->onStartCommand---->onDestroy
(3)当我们反复开启Service时:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
从上图能够看出。每当Service被创建时回调onCreate方法。每次Service被启动时都会回调onStartCommand方
法。多次启动一个已有的Service组件将不会再回调onCreate方法,但每次启动时都会回调onStartCommand方法。
当中,当我按下home键时。并没有回调onDestroy方法,也就是说此Service并没有随着Android系统的关闭而关
闭。
bindService的使用
使用startService方法启动服务。当程序被强制退出时。而且没有调用stopService来停止服务,Service会保持在
后台一直执行。直到Android系统关闭或调用stopService方法后才会停止。
假设我们希望在启动服务的Activity关闭后
服务自己主动关闭,这就须要将Activity和Service进行绑定。
通过bindService方法能够将Activity和Service绑定。bindService方法的定义例如以下:
- public boolean bindService(Intent service, ServiceConnection conn,int flags)
该方法的三个參数含义例如以下:
(1)service:该參数通过Intent指定要启动的Service。
(2)conn:该參数的类型是ServiceConnection。负责连接Intent对象指定的服务。
当訪问者与Service之间连接
成功时将回调ServiceConnecttion对象的onServiceConnected(ComponentName name,IBinder service)方法。当
Service所在的宿主进程因为异常终止或因为其它原因终止,导致该Service与訪问者之间断开连接时回调
ServiceConnection对象的onServiceDisconnected(ComponentName name)方法。
(3)flags:该參数是一个标志位。一般设为Context.BIND_AUTO_CREATE。
下面创建了一个继承Service的类。在该类中添加了几个与绑定相关的事件方法:
- public class MyFirstService extends Service{
- private String info;
- private MyBinder myBinder=new MyBinder();
- public static final String TAG="MyFirstService";
- /**
- * 又一次绑定时调用该方法
- */
- @Override
- public void onRebind(Intent intent) {
- super.onRebind(intent);
- }
- /**
- * 解除绑定时调用该方法
- */
- @Override
- public boolean onUnbind(Intent intent) {
- return super.onUnbind(intent);
- }
- @Override
- public IBinder onBind(Intent intent) {
- return myBinder;
- }
- @Override
- public void onCreate() {
- super.onCreate();
- Log.e(TAG, "--------onCreate--------");
- info="onCreate";
- }
- @Override
- public int onStartCommand(Intent intent, int flags, int startId) {
- Log.e(TAG, "--------onStartCommand--------");
- return super.onStartCommand(intent, flags, startId);
- }
- @Override
- public void onDestroy() {
- super.onDestroy();
- Log.e(TAG, "--------onDestroy--------");
- }
- public class MyBinder extends Binder{
- public String getInfo(){
- return info;
- }
- }
- }
- public class MainActivity extends Activity implements OnClickListener {
- private Button btn_startService;
- private Button btn_stopService;
- private Button btn_bindService;
- private Button btn_unbindService;
- private Button btn_getinfo;
- private Intent serviceIntent;
- private MyFirstService.MyBinder myBinder;
- private ServiceConnection conn = new ServiceConnection() {
- @Override
- public void onServiceDisconnected(ComponentName name) {
- Log.e(MyFirstService.TAG, "------onServiceDisconnected---------");
- }
- @Override
- public void onServiceConnected(ComponentName name, IBinder service) {
- Log.e(MyFirstService.TAG, "------onServiceConnected---------");
- myBinder = (MyFirstService.MyBinder) service;
- }
- };
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- initData();
- initView();
- initEvent();
- }
- private void initData() {
- serviceIntent = new Intent(this, MyFirstService.class);
- }
- private void initView() {
- btn_startService = (Button) this.findViewById(R.id.btn_startService);
- btn_stopService = (Button) this.findViewById(R.id.btn_stoptService);
- btn_bindService = (Button) this.findViewById(R.id.btn_bindService);
- btn_unbindService = (Button) this.findViewById(R.id.btn_unbindService);
- btn_getinfo = (Button) this.findViewById(R.id.btn_getinfo);
- }
- private void initEvent() {
- btn_startService.setOnClickListener(this);
- btn_stopService.setOnClickListener(this);
- btn_bindService.setOnClickListener(this);
- btn_unbindService.setOnClickListener(this);
- btn_getinfo.setOnClickListener(this);
- }
- @Override
- public void onClick(View v) {
- switch (v.getId()) {
- case R.id.btn_startService:// startService
- startService(serviceIntent);
- break;
- case R.id.btn_stoptService:// stopService
- stopService(serviceIntent);
- break;
- case R.id.btn_bindService:// bindService
- bindService(serviceIntent, conn, Service.BIND_AUTO_CREATE);
- break;
- case R.id.btn_unbindService:// unbindService
- unbindService(conn);
- break;
- case R.id.btn_getinfo:// 获取数据
- Toast.makeText(MainActivity.this, myBinder.getInfo(),
- Toast.LENGTH_SHORT).show();
- break;
- default:
- break;
- }
- }
- }
执行效果:
在MyFirstService类中定义了一个MyBinder类。该类用于获取一个String类型的返回值,
ServiceConnection.onServiceConnected方法的第2个參数是一个IBinder类型的变量,将该參数转换成
MyFirstService.MyBinder对象,并使用myBinder.getInfo()方法获取String类型的值。
接着看下我们是怎样使用bindService和unbindService操作的。
(1)当我们单击一次bindService(bindService(service,conn,flags))button时:
(2)当我们单击一次unbindServicebutton时:
从上面能够看出通过bindService开启服务。再通过unbindService停止服务的过程是 onCreate------>onBind------
->onServiceConnected------->onUnbind------>onDestory
这里面值得注意的是。当我按下home键时。此时并没有调用unbindService方法进行停止服务。但依旧能打印出
onUnbind---->onDestory,也就是说通过bindService开启的服务是随着Activity的销毁而销毁。
Service的生命周期
下图的左半部分是通过startService()方法启动时的Service生命周期,右半部分是通过bindService()方法启动时
的Service生命周期。
Service生命周期有一种特殊的情形,假设Service已由某个client通过startService()方法启动了,接下来其它客
户端再调用bindService()方法来绑定该Service后。再调用unbindService()方法解除绑定,最后又调用了bindService()
方法再次绑定到Service,这个过程所触发的生命周期例如以下:
进行拆解步骤:
(1)调用startService时的生命周期:onCreate------>onStartCommand
(2)调用bindService时的生命周期:onBind------>onServiceConnected
(3)调用unbindService时的生命周期:onUnbind
(4)再一次调用bindService时的生命周期:onServiceConnected----->onRebind
以上调用unbindService时。并没有回调onDestroy()方法,这是由于该Service并非由Activity通过bindService()
方法来启动的,因此当Activity调用unbindService()方法取消与该Activity的绑定时,该Service也不会终止。当Activity
调用bindService()绑定一个已经启动的Service时,系统仅仅是把Service内部IBinder对象传给Activity,当Activity调用
unbindService()方法取消与该Service的绑定时,仅仅是切断了Activity与Service之间的联系。并不能停止Service组件。
-------------------------------------------------------------------------------------------------------------------------------------------------------
转载请注明出处:http://blog.csdn.net/hai_qing_xu_kong/article/details/47722185情绪控
关于Android中的四大组件(Service的开启与关闭)的更多相关文章
- 详解Android中的四大组件之一:Activity详解
activity的生命周期 activity的四种状态 running:正在运行,处于活动状态,用户可以点击屏幕,是将activity处于栈顶的状态. paused:暂停,处于失去焦点的时候,处于pa ...
- Android笔记(五十九)Android总结:四大组件——Service篇
什么是服务? 服务(service)是Android中实现程序后台运行的解决方案,适用于去执行那些不需要和用户交互并且还需要长期运行的任务.服务的运行不依赖于任何用户界面. 服务运行在主线程中,所以在 ...
- Android中Broadcast Receiver组件具体解释
BroadcastReceiver(广播接收器)是Android中的四大组件之中的一个. 以下是Android Doc中关于BroadcastReceiver的概述: ①广播接收器是一个专注于接收广播 ...
- 【Android中Broadcast Receiver组件具体解释
】
BroadcastReceiver(广播接收器)是Android中的四大组件之中的一个. 以下是Android Doc中关于BroadcastReceiver的概述: ①广播接收器是一个专注于接收广播 ...
- Android笔记(六十)Android总结:四大组件——BroadcastReceiver篇
什么是BroadcastReceiver BroadcastReceiver是Android体系的四大组件之一,本质上是一种全局的监听器,用于监听系统全局的广播消息,正式因为其本质为全局监听,因此可以 ...
- 【Android】安卓四大组件之Activity(二)
[Android]安卓四大组件之Activity(二) 前言 在这篇文章之前,我已经写过了一篇有关Activity的内容,是关于activity之间的页面跳转和数据传递,而这篇文章着重强调的是Acti ...
- 【Android】安卓四大组件之Activity(一)
[Android]安卓四大组件之Activity(一) 前言 Activity是Android学习中的一个重要组件,想要对其进行系统的了解可以分为几块内容,这一大章节的内容是有关于activity之间 ...
- 【Android】安卓四大组件之内容提供者
[Android]安卓四大组件之内容提供者 1.关于内容提供者 1.1 什么是内容提供者 内容提供者就是contentProvider,作用有如下: 给多个应用提供数据 类似一个接口 可以和多个应用分 ...
- android中使用spinner组件,以key,value的方式
接着上一篇文章的内容:android中使用spinner组件 稍做修改,以key,value的方式,在实际使用中,经常需要获取的值并不一定跟显示的内容一致. 需要先添加一个对象类,用来描述key,va ...
随机推荐
- 判断IE浏览器的类型以及提示信息(低版本浏览器不予显示)
//浏览器IE版本判断(function(window) { var theUA = window.navigator.userAgent.toLowerCase(); if ((theU ...
- Elasticsearch--预匹配器
当你对一个无限输入数据流进行操作并搜索特定事件的出现时,可以使用此模型.可以用于检测监控系统中的故障. 在新版本中的知识点位置https://www.elastic.co/guide/en/elast ...
- CentOS6.6从头到尾部署nginx与tomcat多实例
前提条件: 1.需要一个全新的centos系统(本文中用到是centos6.6) 2.vmware虚拟机 3.vmware下安装centos系统,以NAT方式与宿主机相连 4.在centos系统中pi ...
- 读《An Adaptable and Extensible Geometry Kernel》
读<An Adaptable and Extensible Geometry Kernel> 利用Curiously Recurring Template Pattern替代虚函数 详细内 ...
- [Windows Server 2003] 手工创建安全网站
★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频.★ 本节我们将带领大家:手工创建安全站 ...
- 如何让一个div里面的div垂直居中?
如何让一个div里面的div垂直居中? 如何让上面灰色有文字那个div和背景图标垂直居中,不管屏幕大小有好大,始终在垂直方向上的中间.上面有整个布局和样式表,谢谢高手指点 CSS3时代当然要用CSS3 ...
- Deployd的使用
deployd一个生成后台数据的软件,可以创建json格式的数据,也可以对数据进行增删改查等操作,甚至可以验证登录,简直就是自学好帮手呀,不用后台搞定后台,就用deployd 下载:链接: https ...
- 16Oracle Database 系统权限和对象权限
Oracle Database 系统权限和对象权限 Oracle中的系统权限和对象权限 DCL 数据控制语言 -- 查看对象的权限 grant / revoke 查看登录用户 Show user 查看 ...
- 25款css动画库
http://www.swiper.com.cn/usage/animate/index.html //swiper https://cssanimation.io/ http://ianlunn ...
- [POJ1155]TELE(树形背包dp)
看到这道题的第一眼我把题目看成了TLE 哦那不是重点 这道题是树形背包dp的经典例题 题目描述(大概的): 给你一棵树,每条边有一个cost,每个叶节点有一个earn 要求在earn的和大于等于cos ...