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

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


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

创建一个Service类来做后台工作;从您的主应用程序启动服务。可选地提供通知图标,以允许用户停止正在运行的服务或恢复主应用程序。
讨论
服务类(android.app.Service)作为与主应用程序相同的进程的一部分运行,但具有一个属性,即使用户切换到另一个应用程序或转到主屏幕并启动一个新的应用程序。
正如你现在所知道的,Activity类可以通过与其内容提供者匹配的意图启动,或者通过按类名称提及它们的意图启动。服务也是如此。这个菜谱着重于直接启动服务;配方4.1涵盖了隐式启动服务。以下示例取自JPSTrack,Android的GPS跟踪程序。一旦您开始跟踪,您不希望跟踪停止,如果你接听电话或必须看地图(!),所以我们使它成为一个服务。如示例4-10所示,当您单击开始跟踪按钮时,服务由主活动启动,并由停止按钮停止。注意,这是非常普遍的,startService()和stopService()被内置到Activity类中。
实例4-10。 onCreate方法
@Override
public void onCreate(Bundle savedInstanceState) {
...
Intent theIntent = new Intent(this, TrackService.class);
Button startButton = (Button) findViewById(R.id.startButton);
startButton.setOnClickListener(new OnClickListener() {
@Override
public 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() {
@Override
public 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;
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
initGPS(); // sets up the LocationManager mgr
if (preferredProvider != null) {
mgr.requestLocationUpdates(preferredProvider, MIN_SECONDS * 1000,
MIN_METRES, this);
return START_STICKY;
}
return START_NOT_STICKY;
}
@Override
public 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子类:

你可能感兴趣的:(android,嵌入式开发,mobile,Java,android)