关于Android中的四大组件(Service的开启与关闭)
来源:互联网 发布:p2p对等网络监管 编辑:程序博客网 时间:2024/06/09 22:44
前言
服务(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";@Overridepublic IBinder onBind(Intent intent) {return null;}@Overridepublic void onCreate() {super.onCreate();Log.e(TAG, "--------onCreate--------");}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {Log.e(TAG, "--------onStartCommand--------");return super.onStartCommand(intent, flags, startId);}@Overridepublic 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使用
下面程序通过两个按钮进行启动与停止Service,演示Service通过startService从创建到销毁整个过程。
public class MyFirstService extends Service{public static final String TAG="MyFirstService";@Overridepublic IBinder onBind(Intent intent) {return null;}@Overridepublic void onCreate() {super.onCreate();Log.e(TAG, "--------onCreate--------");}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {Log.e(TAG, "--------onStartCommand--------");return super.onStartCommand(intent, flags, startId);}@Overridepublic void onDestroy() {super.onDestroy();Log.e(TAG, "--------onDestroy--------");}}
两个按钮的点击事件:
@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.btn_startService:// startServicestartService(serviceIntent);break;case R.id.btn_stoptService:// stopServicestopService(serviceIntent);break;default:break; }}
以上是我们创建的Service组件,接下来对Service进行操作。
(1)当单击一次启动(startService)按钮时:
(2)当服务被启动后单击一次停止(stopService)按钮时:
从上面可以看出Service从创建到销毁分别经历了 onCreate---->onStartCommand---->onDestroy
(3)当我们重复开启Service时:
从上图可以看出,每当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";/** * 重新绑定时调用该方法 */@Overridepublic void onRebind(Intent intent) {super.onRebind(intent);}/** * 解除绑定时调用该方法 */@Overridepublic boolean onUnbind(Intent intent) {return super.onUnbind(intent);}@Overridepublic IBinder onBind(Intent intent) {return myBinder;}@Overridepublic void onCreate() {super.onCreate();Log.e(TAG, "--------onCreate--------");info="onCreate";}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {Log.e(TAG, "--------onStartCommand--------");return super.onStartCommand(intent, flags, startId);}@Overridepublic 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() {@Overridepublic void onServiceDisconnected(ComponentName name) {Log.e(MyFirstService.TAG, "------onServiceDisconnected---------");}@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {Log.e(MyFirstService.TAG, "------onServiceConnected---------");myBinder = (MyFirstService.MyBinder) service;}};@Overrideprotected 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);}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.btn_startService:// startServicestartService(serviceIntent);break;case R.id.btn_stoptService:// stopServicestopService(serviceIntent);break;case R.id.btn_bindService:// bindServicebindService(serviceIntent, conn, Service.BIND_AUTO_CREATE);break;case R.id.btn_unbindService:// unbindServiceunbindService(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))按钮时:
(2)当我们单击一次unbindService按钮时:
从上面可以看出通过bindService开启服务,再通过unbindService停止服务的过程是 onCreate------>onBind------
->onServiceConnected------->onUnbind------>onDestory
这里面值得注意的是,当我按下home键时,此时并没有调用unbindService方法进行停止服务,但依然能打印出
onUnbind---->onDestory,也就是说通过bindService开启的服务是随着Activity的销毁而销毁。
Service的生命周期
下图的左半部分是通过startService()方法启动时的Service生命周期,右半部分是通过bindService()方法启动时
的Service生命周期。
Service生命周期有一种特殊的情形,如果Service已由某个客户端通过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四大组件中的Service
- 关于Android中的四大组件(AIDL Service的使用)
- Android 关闭和开启四大组件的方法
- Android中的四大组件Service
- Android 四大组件之Service 的生命周期与启动Service
- 关于Android四大组件之一Service
- Android中的四大组件之Service详解
- Android中的四大组件之-Service
- android四大组件之一Service的startService()与bindService()区别?
- Android四大组件----Service
- Android四大组件---Service
- android四大组件service
- android四大组件---service
- android四大组件---Service
- Android四大组件-Service
- Android四大组件:Service
- (Android四大组件)---Service
- SQL2008定时备份数据库
- Linux下的五种I/O模型
- 【effective c++读书笔记】【第7章】模板和泛型编程(3)
- 命名管道(FIFO)
- MyEclipse快捷键大全
- 关于Android中的四大组件(Service的开启与关闭)
- java 基础概念 -- 数组与内存控制
- linux 命令
- string get_telno(string &userid) 和 string get_telno(string userid) 有什么区别
- SpringMVC实现一个controller写多个方法
- swift 中的 Selector 类型
- POJ 1328 Radar Installation(区间贪心)
- 反转单链表
- vijos - P1319数列 (二进制 + 找规律 + python)