《android项目教程Service生命周期》由会员分享,可在线阅读,更多相关《android项目教程Service生命周期(32页珍藏版)》请在金锄头文库上搜索。
1、03进阶篇进阶篇Android移动开发移动开发项目化教程项目化教程 项目十高级用户界面设计 项目十一列表视图ListView 项目十二自定义菜单 项目十三BroadCastReceiver实现广播的接收与发送目录目录CONTNETS 项目十四Service生命周期本章导读Service是Android四大组件中与Activity最相似的组件,它们都代表可执行的程序。Service一旦被启动起来,就与Activity一样,完全具有自己的生命周期。Service与Activity的区别在于:Service一直在后台运行,它没有用户界面,所以绝不会到前台来。因此,如果某个程序组件需要在运行时向用户呈
2、现某种界面,或者该程序需要与用户交互,就需要使用Activity,否则就应该考虑使用Service了。项目十四Service生命周期一、项目要求4项目要求了解Service是什么,有什么用途。掌握Service的生命周期,了解大体工作流程。熟悉Service的两种启动方式,学会使用Service。项目十四Service生命周期二、项目相关知识501Service简介Service是Android系统中的四大组件之一,它是一种长生命周期的、没有可视化界面、运行于后台的一种服务程序。比如我们播放音乐的时候,有可能想边听音乐边干些其他事情,当退出播放音乐的应用,如果不用Service,我们就听不到歌
3、了。服务主要用于两个目的:后台运行和跨进程访问。通过启动一个服务,可以在不显示界面的前提下在后台运行指定的项目,这样可以不影响用户做其他的事情。通过AIDL服务可以实现不同进程之间的通信,这也是服务的重要用途之一。项目十四Service生命周期二、项目相关知识602Service生命周期Service的生命周期并不像Activity那么 复 杂 , 它 只 继 承 了 onCreate(), onStartCommend(),onDestroy()三个方法,当第一次启动Service时,先后调用了onCreate()和onStart()这 两 个 方 法 , 当 停 止 Service时 ,
4、则 执 行 onDestroy()方法,这里需要注意的是,如果Service已经启动了,当我们再次启动Service时,不会再执行onCreate()方法,而是直接执行onStart()方法。项目十四Service生命周期二、项目相关知识7Android下的Service生命周期分为未绑定Activity的service和绑定了Activity的service。两种不同service服务的生命周期图示如图14-1所示。图14-1 service生命周期示意图项目十四Service生命周期二、项目相关知识8未绑定Activity的Service必须通过startService()方法启动,生命周
5、期依次包含了创建onCreate(),开始onStartCommand(),销毁onDestory()三个方法。其中创建方法onCreate()和销毁方法onDestory()只被调用一次,开始方法onStartCommand()方法可以被调用多次。绑定了Activity的Service通过bindService()方法启动,生命周期包括创建onCreate()、绑定onBind()、解绑onUnbind()和销毁onDestory()四个方法。其中创建和销毁、绑定和解绑方法是对应的,都只执行一次。项目十四Service生命周期二、项目相关知识9什么是AIDL?AIDL全称是Android I
6、nterface Definition Language,这是一种接口定义语言,采用远程过程调用(Remote Procedure Call,RPC)方式实现。这些服务可以被其他应用程序访问。建立AIDL服务分为以下几个步骤:(1)在Android工程的Java源目录中建立一个扩展名为aidl的文件。(2)建立aidl文件的内容正确,ADT会自动生成一个Java接口文件(*.Java)。(3)建立一个服务类(Service子类)。(4)实现由aidl文件生成的Java接口。( 5) 在 AndroidManifest.xml文 件 中 配 置 AIDL服 务 , 标 签 中android:na
7、me的属性值就是客户端要引用的该服务的ID,也就是Intent类构造方法的参数值。03跨进程服务简介项目十四Service生命周期三、项目实施过程10项目十四Service生命周期工程创建01参考前面实验中创建“Helloworld”工程的步骤 创 建 一 个 工 程 ( 如AndroidCode14) , 工程目录结构,如图14-2所示。图14-2 工程目录结构图三、项目实施过程11XML布局文件的开发02界面采用相对布局管理器(垂直),里面再包含一个表格布局(水平),这个表格布局里包含四个Button(分别是启动服务、停止服务、绑定服务、解绑服务),表格布局下面是一个Button(退出程序
8、),界面如图14-3所示。1图14-3 界面设置项目十四Service生命周期三、项目实施过程12界面设计完整代码。(见书中详细代码)2按【Ctrl+S】组合键保存后退出,至此界面文件就编写完成了。3项目十四Service生命周期三、项目实施过程13Java文件的开发03在MainActivity中定义开启服务、停止服务、绑定服务、解绑服务和退出5个Button按钮并初始化。初始化控件对象,使程序运行时候的控件显示和XML文件中绘制好的控件关联起来,对控件的操作就是对图形化界面上按钮的操作:1项目十四Service生命周期程序由三个类文件组成:MainActivity(主界面),MyBroad
9、castReceiver(广播类)和MyService(服务类)。广播类用户接收程序发送的信息并处理相关操作。Button btnStartService, btnStopService, btnBindService, btnUnbindService,btnExit;三、项目实施过程14项目十四Service生命周期给5个Button按钮设定监听器,单击按钮时触发监听器,对应不同按钮监听器做出不同的响应。btnStartService = (Button) findViewById(R.id.btn_start_service);btnStopService = (Button) find
10、ViewById(R.id.btn_stop_service);btnBindService = (Button) findViewById(R.id.btn_bind_service);btnUnbindService = (Button) findViewById(R.id.btn_unbind_service);btnExit=(Button)findViewById(R.id.btn_exit);三、项目实施过程15项目十四Service生命周期对应五个按钮的intent服务,分别对应启动服务、停止服务、绑定服务和解绑服务。public void onClick(View v) Int
11、ent intent = new Intent();intent.setClass(context, MyService.class);switch (v.getId() / 启动服务case R.id.btn_start_service:context.startService(intent);break;/ 停止服务case R.id.btn_stop_service:context.stopService(intent);break;三、项目实施过程16项目十四Service生命周期/ 绑定服务case R.id.btn_bind_service:context.bindService(
12、intent, serviceConnection, BIND_AUTO_CREATE);break;/ 解绑服务case R.id.btn_unbind_service:context.unbindService(serviceConnection);break;case R.id.btn_exit:unregisterReceiver(receiver);finish();break;default:break;三、项目实施过程17项目十四Service生命周期public void onReceive(Context context, Intent intent) / TODO Auto
13、-generated method stubString action = intent.getAction();if (action.equals(update) String time = intent.getExtras().getString(time);System.out.println(time);System.out.println(=+mContext);在MyBroadcastReceiver类中重写onReceive方法,该方法用于接收update更新的广播信息,当程序收到内容为“update”的action时输出当前时间:2三、项目实施过程18项目十四Service生命
14、周期public void onCreate() Log.i(TAG, 启动服务);Toast.makeText(mContext, 启动服务, Toast.LENGTH_SHORT).show();/ 开启计数new Thread(new Runnable() Overridepublic void run() / TODO Auto-generated method stubwhile (!flag) try 在MyService类中的关键代码说明:Service类里的代码就是单击不同Button按钮时所触发的相应操作,此服务在后台运行。在MyService类中编写代码,实现开启服务,关闭
15、服务,绑定服务,解绑服务的方法。新建一个Thread线程每隔一秒钟输出当前的精确时间,并用intent传递数据给接收器使用。3三、项目实施过程19项目十四Service生命周期Thread.sleep(1000);Log.i(TAG, now time= + getSystemTime(); / 发送消息String str = current time:+getSystemTime();intent = new Intent();intent.setAction(update);intent.putExtra(time, str);mContext.sendBroadcast(intent)
16、; catch (Exception e) / TODO: handle exception ).start();super.onCreate();三、项目实施过程20项目十四Service生命周期在onDestory()方法中新建一个Thread线程暂停1s,然后打印输出“服务停止”:Overridepublic void onDestroy() flag = true;try Thread.sleep(1000); catch (InterruptedException e) / TODO Auto-generated catch blocke.printStackTrace();Log.i(TAG, 停止服务);Toast.makeText(mContext, 停止服务, Toast.LENGTH_SHORT).show();super.onDestroy();三、项目实施过程21项目十四Service生命周期在onStartCommand方法中输出开始的命令,在log输出结果中可以看到当程序结束时候,不管是否已经关闭服务,服务都会被终止。public int onStartCo