4.6在显示其他应用程序的同时运行后台服务


问题
您希望您的应用程序的一部分继续在后台运行,而用户切换到与其他应用程序交互。

创建一个Service类来做后台工作;从您的主应用程序启动服务。可选地提供通知图标,以允许用户停止正在运行的服务或恢复主应用程序。
讨论
服务类(android.app.Service)作为与主应用程序相同的进程的一部分运行,但具有一个属性,即使用户切换到另一个应用程序或转到主屏幕并启动一个新的应用程序。
正如你现在所知道的,Activity类可以通过与其内容提供者匹配的意图启动,或者通过按类名称提及它们的意图启动。服务也是如此。这个菜谱着重于直接启动服务;配方4.1涵盖了隐式启动服务。以下示例取自JPSTrack,Android的GPS跟踪程序。一旦您开始跟踪,您不希望跟踪停止,如果你接听电话或必须看地图(!),所以我们使它成为一个服务。如示例4-10所示,当您单击开始跟踪按钮时,服务由主活动启动,并由停止按钮停止。注意,这是非常普遍的,startService()和stopService()被内置到Activity类中。
实例4-10。 onCreate方法
@Overridepublic void onCreate(Bundle savedInstanceState) {...Intent theIntent = new Intent(this, TrackService.class);Button startButton = (Button) findViewById(R.id.startButton);startButton.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {startService(theIntent);Toast.makeText(Main.this, "Starting", Toast.LENGTH_LONG).show();}});Button stopButton = (Button) findViewById(R.id.stopButton);stopButton.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {stopService(theIntent);Toast.makeText(Main.this, "Stopped", Toast.LENGTH_LONG).show();}});...}

TrackService类直接扩展了Service,所以它必须实现抽象的onBind()方法。这是在类直接启动时不使用的,所以它可以是一个存根方法。您通常会至少覆盖onStartCommand()和onUnbind()方法,以开始和结束某些活动。例4-11启动GPS服务向我们发送通知,我们保存到磁盘,我们希望它继续运行,因此这个Service类。

实例4-11。 TrackService(使用GPS的服务)类
public class TrackService extends Service {private LocationManager mgr;private String preferredProvider;@Overridepublic IBinder onBind(Intent intent) {return null;}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {initGPS(); // sets up the LocationManager mgrif (preferredProvider != null) {mgr.requestLocationUpdates(preferredProvider, MIN_SECONDS * 1000,MIN_METRES, this);return START_STICKY;}return START_NOT_STICKY;}@Overridepublic boolean onUnbind(Intent intent) {mgr.removeUpdates(this);return super.onUnbind(intent);}

您可能已经注意到onStartCommand()的不同返回值。如果您返回START_STICKY,Android会在服务终止后重新启动您的服务。如果您返回START_NOT_STICKY,该服务将不会自动重新启动。这些值在Service类的联机文档中有更详细的讨论(请参见http://developer.android.com/reference/android/app/Service.html)。请记住在AndroidManifest.xml的应用程序部分中声明Service子类:

更多相关文章

  1. Android冷启动与热启动概念
  2. 两部android设备通过服务器转发实现通信简单demo
  3. Android(安卓)插件化框架DroidPlugin
  4. 【Android】webView 使用 系统自带搜索对话框问题
  5. Android:Service生命周期方法与Service启动方式bindService与Star
  6. Android系统的Binder机制之三——服务代理对象(2)
  7. Android(安卓):为你的启动页面SplashActivity 添加动画的几种方法
  8. Android(安卓)手机端与服务器端通过http交换数据 Json
  9. 关于android创建快捷方式会启动两个应用的问题(二)

随机推荐

  1. Android修改自己程序字体
  2. Android Studio下添加assets目录
  3. Android菜单详解
  4. 跟大家分享下Android布局文件layout.xml
  5. android binder 基础实例及解析(一)
  6. Android中集结了大量的系统管家Manager
  7. Android 代码实现应用强制装到手机内存
  8. android studio查看模拟器文件夹
  9. Android 对象序列化之你不知道的 Seriali
  10. [Android随笔]Android参考书籍