第七章android后台服务_电话服务_SMS_MMS.docx

上传人:小飞机 文档编号:2029924 上传时间:2023-01-02 格式:DOCX 页数:44 大小:214.47KB
返回 下载 相关 举报
第七章android后台服务_电话服务_SMS_MMS.docx_第1页
第1页 / 共44页
第七章android后台服务_电话服务_SMS_MMS.docx_第2页
第2页 / 共44页
第七章android后台服务_电话服务_SMS_MMS.docx_第3页
第3页 / 共44页
第七章android后台服务_电话服务_SMS_MMS.docx_第4页
第4页 / 共44页
第七章android后台服务_电话服务_SMS_MMS.docx_第5页
第5页 / 共44页
点击查看更多>>
资源描述

《第七章android后台服务_电话服务_SMS_MMS.docx》由会员分享,可在线阅读,更多相关《第七章android后台服务_电话服务_SMS_MMS.docx(44页珍藏版)》请在三一办公上搜索。

1、Android后台服务,Android电话服务,SMS和MMS1. Service技术1.1. Service概念及用途:Adroid中的服务,它与Activity不同,它是不能与用户交互的,不能自己启动的,运行在后台的程序,如果我们退出应用时,Service进程并没有结束,它仍然在后台运行,那 我们什么时候会用到Service呢?比如我们播放音乐的时候,有可能想边听音乐边干些其他事情,当我们退出播放音乐的应用,如果不用Service,我们就听不到歌了,所以这时候就得用到Service了,又比如当我们一个应用的数据是通过网络获取的,不同时间(一段时间)的数据是不同的这时候我们可以用Servic

2、e在后台定时更新,而不用每打开应用的时候在去获取。1.2. Service的类型Service有两种类型:A. 本地服务(Local Service):用于应用程序内部B. 远程服务(Remote Sercie):用于android系统内部的应用程序之间本地服务用于实现应用程序自己的一些耗时任务,比如查询升级信息,并不占用应用程序比如Activity所属线程,而是单开线程后台执行,这样用户体验比较好。远程服务可被其他应用程序复用,比如天气预报服务,其他应用程序不需要再写这样的服务,调用已有的即可。1.3. 启动服务两种式:A. startService(intent):用该方式启动服务,该服务

3、不会跟启动的应用程序绑定在一起,该服务启动完之后,应用程序终止,该服务会继续在后台运行B. bindService(intent, conn, Service.BIND_AUTO_CREATE):绑定服务,该服务会跟启动的应用程序绑定在一起,该服务启动完之后,如果应用程序终止,该服务会终止运行1.4. 终止服务方式:A. 由其它程序来终止服务,context.stopService(intent)或者context.unbindService(conn)B. 由服务自己来终止:Service.stopSelf()或者Service.stopSelfResult(startId)1.5. Ser

4、vice生命周期 :Android Service的生命周期并不像Activity那么复杂,只有onCreate(),onStart(),onDestroy()三个方法,当我们第一次启动Service时,先后调用了onCreate(),onStart()这两个方法,当停止Service时,则执行onDestroy()方法,这里需要注意的是,如果Service已经启动了,当我们再次启动Service时,不会在执行onCreate()方法,而是直接执行onStart()方法,启动多次服务时,会调用onStart()方法多次, 但onCreate()只被调用一次,无论onStart()方法调用多少次

5、,停止服务服务只需调用一次即可而启动service,根据onStartCommand的返回值不同,有两个附加的模式:分析onStartCommand方法参数的作用和返回值的作用:1、根据这个方法的返回值不同可以有两种启动模式START_NOT_STICKY,START_STICKY,(当进程被杀死的时候,是否重新启动。如果是参数:START_REDELIVER_INTENT表示当服务所在进程被杀死后,重新启动,并且重新传递Intent内容,其它两个参数不会重新传递intent,都为null)2、返回START_REDELIVER_INTENT的时候,如果不论启动多少次,当重新启动的时候,也会启

6、动多少次。3、是当前服务的标记4、第三个参数startId表示当前启动的Service的次数。看看官方给出的比较流程示意图:官方文档告诉我们,一个service可以同时start并且bind,在这样的情况,系统会一直保持service的运行状态如果service已经start了或者BIND_AUTO_CREATE标志被设置。如果没有一个条件满足,那么系统将会调用onDestory方法来终止service.所有的清理工作(终止线程,反注册接收器)都在onDestory中完成。拥有service的进程具有较高的优先级官方文档告诉我们,Android系统会尽量保持拥有service的进程运行,只要在

7、该service已经被启动(start)或者客户端连接(bindService)到它。当内存不足时,需要保持,拥有service的进程具有较高的优先级。1 如果service正在调用onCreate,onStartCommand或者onDestory方法,那么用于当前service的进程则变为前台进程以避免被killed。2 如果当前service已经被启动(start),拥有它的进程则比那些用户可见的进程优先级低一些,但是比那些不可见的进程更重要,这就意味着service一般不会被killed.3 如果客户端已经连接到service (bindService),那么拥有Service的进程则

8、拥有最高的优先级,可以认为service是可见的。4 如果service可以使用startForeground(int, Notification)方法来将service设置为前台状态,那么系统就认为是对用户可见的,并不会在内存不足时killed。如果有其他的应用组件作为Service,Activity等运行在相同的进程中,那么将会增加该进程的重要性。1.6. Service与Activity通信:Service后端的数据最终还是要呈现在前端Activity之上的,因为启动Service时,系统会重新开启一个新的进程,这就涉及到不同进程间通信的问题了(AIDL)这一节我不作过多描述,当我们想获

9、取启动的Service实例时,我们可以用到bindService和onBindService方法,它们分别执行了Service中IBinder()和onUnbind()方法。1.7. 编写一个后台服务步骤:1.7.1. 写一个类继承Service类1.7.2. 在清单文件描述Service类1.7.3. 服务不能自己启动,必须由其它程序来启动1.8. 代码示例:实例一演示如何创建、启动、停止及绑定一个service程序文件/Chapter07_Service_Example/src/com/amaker/ch07/app/MainActivity.javapackage com.amaker.

10、ch07.app;import com.amaker.ch07.app.R;import android.app.Activity;import android.app.Service;import android.content.ComponentName;import android.content.Intent;import android.content.ServiceConnection;import android.os.Bundle;import android.os.IBinder;import android.util.Log;import android.view.View

11、;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.Toast;/* * 测试Service */public class MainActivity extends Activity / 声明Button private Button startBtn,stopBtn,bindBtn,unbindBtn; Override public void onCreate(Bundle savedInstanceState) super.onCreate(savedIn

12、stanceState); / 设置当前布局视图 setContentView(R.layout.main); / 实例化Button startBtn = (Button)findViewById(R.id.startButton01); stopBtn = (Button)findViewById(R.id.stopButton02); bindBtn = (Button)findViewById(R.id.bindButton03); unbindBtn = (Button)findViewById(R.id.unbindButton04); / 添加监听器 startBtn.setOn

13、ClickListener(startListener); stopBtn.setOnClickListener(stopListener); bindBtn.setOnClickListener(bindListener); unbindBtn.setOnClickListener(unBindListener); / 启动Service监听器 private OnClickListener startListener = new OnClickListener() Override public void onClick(View v) / 创建Intent Intent intent =

14、 new Intent(); / 设置Action属性 intent.setAction(com.amaker.ch07.app.action.MY_SERVICE); / 启动该Service startService(intent); ; / 停止Service监听器 private OnClickListener stopListener = new OnClickListener() Override public void onClick(View v) / 创建Intent Intent intent = new Intent(); / 设置Action属性 intent.setA

15、ction(com.amaker.ch07.app.action.MY_SERVICE); / 启动该Service stopService(intent); ; / 连接对象 private ServiceConnection conn = new ServiceConnection() Override public void onServiceConnected(ComponentName name, IBinder service) Log.i(SERVICE, 连接成功!); Toast.makeText(MainActivity.this, 连接成功!, Toast.LENGTH_

16、LONG).show(); Override public void onServiceDisconnected(ComponentName name) Log.i(SERVICE, 断开连接!); Toast.makeText(MainActivity.this, 断开连接!, Toast.LENGTH_LONG).show(); ; / 綁定Service监听器 private OnClickListener bindListener = new OnClickListener() Override public void onClick(View v) / 创建Intent Intent

17、 intent = new Intent(); / 设置Action属性 intent.setAction(com.amaker.ch07.app.action.MY_SERVICE); / 绑定Service bindService(intent, conn, Service.BIND_AUTO_CREATE); ; / 解除绑定Service监听器 private OnClickListener unBindListener = new OnClickListener() Override public void onClick(View v) / 创建Intent Intent inte

18、nt = new Intent(); / 设置Action属性 intent.setAction(com.amaker.ch07.app.action.MY_SERVICE); / 解除绑定Service unbindService(conn); ; /Chapter07_Service_Example/src/com/amaker/ch07/app/MyService.javapackage com.amaker.ch07.app;import android.app.Service;import android.content.Intent;import android.os.IBinde

19、r;import android.util.Log;import android.widget.Toast;/* * 测试Service */public class MyService extends Service / 可以返回null,通常返回一个有aidl定义的接口 public IBinder onBind(Intent intent) Log.i(SERVICE, onBind.); Toast.makeText(MyService.this, onBind., Toast.LENGTH_LONG).show(); return null; / Service创建时调用 publi

20、c void onCreate() Log.i(SERVICE, onCreate.); Toast.makeText(MyService.this, onCreate., Toast.LENGTH_LONG).show(); / 当客户端调用startService()方法启动Service时,该方法被调用 public void onStart(Intent intent, int startId) Log.i(SERVICE, onStart.); Toast.makeText(MyService.this, onStart., Toast.LENGTH_LONG).show(); /

21、当Service不再使用时调用 public void onDestroy() Log.i(SERVICE, onDestroy.); Toast.makeText(MyService.this, onDestroy., Toast.LENGTH_LONG).show(); /Chapter07_Service_Example/res/layout/main.xml 清单文件/Chapter07_Service_Example/AndroidManifest.xml 实例二、远程service调用实现方式RPC(remote procedures call)远程进程调用 (android in

22、terface definition language)接口定义语言步骤:1)编写aidl接口,ADT插件会主动生成一些相关接口2)编写aidl接口对应的实现类3)在service中的onBind()方法返回远程接口实现类对象/Chapter07_Service_Remote/src/com/amaker/ch07/app/MainActivity.java代码 package com.amaker.ch07.app;import com.amaker.ch07.app.IPerson;import com.amaker.ch07.app.R;import android.app.Activi

23、ty;import android.app.Service;import android.content.ComponentName;import android.content.Intent;import android.content.ServiceConnection;import android.os.Bundle;import android.os.IBinder;import android.os.RemoteException;import android.view.View;import android.view.View.OnClickListener;import andr

24、oid.widget.Button;import android.widget.Toast;/* * * RPC 测试 */public class MainActivity extends Activity / 声明IPerson接口 private IPerson iPerson; / 声明 Button private Button btn; / 实例化ServiceConnection private ServiceConnection conn = new ServiceConnection() Override synchronized public void onServiceC

25、onnected(ComponentName name, IBinder service) / 获得IPerson接口 iPerson = IPerson.Stub.asInterface(service); if (iPerson != null) try / RPC 方法调用 iPerson.setName(hz.guo); iPerson.setAge(30); String msg = iPerson.display(); / 显示方法调用返回值 Toast.makeText(MainActivity.this, msg, Toast.LENGTH_LONG) .show(); cat

26、ch (RemoteException e) e.printStackTrace(); Override public void onServiceDisconnected(ComponentName name) ; Override public void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); / 设置当前视图布局 setContentView(R.layout.main); / 实例化Button btn = (Button) findViewById(R.id.Button01);

27、/为Button添加单击事件监听器 btn.setOnClickListener(new OnClickListener() Override public void onClick(View v) / 实例化Intent Intent intent = new Intent(); / 设置Intent Action 属性 intent .setAction(com.amaker.ch09.app.action.MY_REMOTE_SERVICE); / 绑定服务 bindService(intent, conn, Service.BIND_AUTO_CREATE); ); /Chapter0

28、7_Service_Remote/src/com/amaker/ch07/app/MyRemoteService.java代码 package com.amaker.ch07.app;import android.app.Service;import android.content.Intent;import android.os.IBinder;import com.amaker.ch07.app.IPerson.Stub;/* * 使用Service将接口暴露给客户端 */public class MyRemoteService extends Service / 声明IPerson接口

29、private Stub iPerson = new IPersonImpl(); Override public IBinder onBind(Intent intent) return iPerson; /Chapter07_Service_Remote/src/com/amaker/ch07/app/IPersonImpl.java代码 package com.amaker.ch07.app;import com.amaker.ch07.app.IPerson;import android.os.RemoteException;/* * * IPerson接口实现类 */public c

30、lass IPersonImpl extends IPerson.Stub / 声明两个变量 private int age; private String name; Override / 显示name和age public String display() throws RemoteException return name:+name+;age=+age; Override / 设置age public void setAge(int age) throws RemoteException this.age = age; Override / 设置name public void set

31、Name(String name) throws RemoteException this.name = name; /Chapter07_Service_Remote/src/com/amaker/ch07/app/IPerson.aidlpackage com.amaker.ch07.app;interface IPerson void setAge(int age); void setName(String name); String display();布局文件/Chapter07_Service_Remote/res/layout/main.xml代码 清单文件/Chapter07_Service_Remote/AndroidManifest.xml代码 uses-sdk android:m

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号