这两条路径并非完全独立,即开发人员可以绑定已经使用startService()方法启动的服务。例如,后台音乐服务能使用包含音乐信息的Intent通过调用startService()方法启动。当用户需要控制播放器或者获得当前音乐信息时,可以调用bindService()方法绑定Activity到服务。此时,stopService()和stopSelf()方法直到全部客户端解绑定时才能停止服务。图13.10演示了两类服务的生命周期。
图13.10 服务的生命周期
13.5 经典范例
13.5.1 视力保护程序
例13.5 在Eclipse中创建Android项目,名称为13.5,当应用程序运行1分钟后,显示提示信息,提醒用户保护视力。(实例位置:光盘\TM\sl\13\13.5)
(1)修改res\layout目录中的main.xml文件,定义应用程序的背景图片和一个文本框,代码如下:
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/background"
android:orientation="vertical" >
android:id="@+id/textView"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="@string/activity_title"
android:textColor="@android:color/black"
android:textSize="25dp" />
(2)在com.mingrisoft包中,定义TimeService类,它继承Service类。在onStart()方法中,使用Timer类完成延时操作,在一个新线程中创建消息,并且在60秒后运行,代码如下:
public class TimeService extends Service {
private Timer timer;
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
timer = new Timer(true); //创建Timer对象
}
@Override
public void onStart(Intent intent, int startId) {
super.onStart(intent, startId);
timer.schedule(new TimerTask() {
@Override
public void run() {
String ns = Context.NOTIFICATION_SERVICE;
//获得通知管理器
NotificationManager manager = (NotificationManager) getSystemService(ns);
Notification notification = new Notification(R.drawable.warning, getText(R.string.ticker_text),
System.currentTimeMillis()); //创建通知
CharSequence contentTitle = getText(R.string.content_title); //定义通知的标题
CharSequence contentText = getText(R.string.content_text); //定义通知的内容
Intent intent = new Intent(TimeService.this, TimeActivity.class); //创建Intent对象
PendingIntent contentIntent = PendingIntent.getActivity(TimeService.this, 0, intent,
Intent.FLAG_ACTIVITY_NEW_TASK); //创建PendingIntent对象
//定义通知行为
notification.setLatestEventInfo(TimeService.this, contentTitle, contentText, contentIntent);
manager.notify(0, notification); //显示通知
TimeService.this.stopSelf(); //停止服务
}
}, 60000);
}
}
(3)在com.mingrisoft包中,定义TimeActivity类,它继承Activity类。在onCreate()方法中,启动服务。代码如下:
public class TimeActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
startService(new Intent(this,TimeService.class));
}
}
(4)修改AndroidManifest.xml文件,增加Activity和Service配置,其代码如下:
package="com.mingrisoft"
android:versionCode="1"
android:versionName="1.0" >