Servicet和Activity是不同的,Activity显示图形用户界面,而Service的运行是不可见的——如执行Intent 查找、处理数据、更新Content Provider、激活Intent和触发Notification。Activity在它的生命周期内定期的启动、停止和重新创建,而Service则被设计为是长生命周期的——特别地,它用来执行一些持续性的、可能耗时的操作。
Service 的启动、停止和控制是通过其他应用程序组件来实现的,包括Activity、Broadcast Receiver和其他的Service.如果应用程序提供那些不直接依赖用户输入或者包括耗时操作的功能,Service 也广告是一种选择。
1》创建Service
要定义一下Service ,需要创建一个继承Service 的新类。需要重写onCreate和onBind方法。
为了说明其生命周期,我们也重写了其生命周期方法。如下:
package com.demo.servicedemo;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
public class MyService extends Service {
public MyService() {
// TODO Auto-generated constructor stub
System.out.println("MyService.MyService()");
}
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
System.out.println("MyService.onBind()");
return null;
}
/**
* 当第一次创建Service 时,调用此方法, 此后,如果Service没有停止的情况下,再次启动Service , 都不会再调用此方法
* */
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
System.out.println("MyService.onCreate()");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// TODO Auto-generated method stub
System.out.println("MyService.onStartCommand()");
System.out.println("MyService.onStartCommand()--flags:" + flags);
System.out.println("MyService.onStartCommand()--startId:" + startId);
return super.onStartCommand(intent, flags, startId);
}
/**
* 停止Service 时,调用此方法
* */
@Override
public void onDestroy() {
// TODO Auto-generated method stub
System.out.println("MyService.onDestroy()");
super.onDestroy();
}
}
2》在manifest.xml文件中注册该Service
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.demo.servicedemo"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="19" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!-- 注册Service -->
<service android:name="com.demo.servicedemo.MyService" >
</service>
</application>
</manifest>
3》测试
3.1》测试运行效果
布局代码如下:
activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<Button
android:id="@+id/startButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="启动Service" />
<Button
android:id="@+id/stopButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="停止Service" />
</LinearLayout>
3.2》测试代码如下:
MainActivity.java
package com.demo.servicedemo;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends Activity {
// 声明控件
private Button startButton = null;
private Button stopButton = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
}
private void init() {
// 初始化控件
startButton = (Button) findViewById(R.id.startButton);
stopButton = (Button) findViewById(R.id.stopButton);
// 注册事件
startButton.setOnClickListener(serviceButtonClickListener);
stopButton.setOnClickListener(serviceButtonClickListener);
}
OnClickListener serviceButtonClickListener = new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.startButton:// 启动Service
System.out.println("--startButtonClick()");
Intent startIntent = new Intent();
startIntent.setClass(MainActivity.this, MyService.class);
startService(startIntent);
break;
case R.id.stopButton:// 停止Service
System.out.println("--stopButtonClick()");
Intent stopIntent = new Intent();
stopIntent.setClass(MainActivity.this, MyService.class);
stopService(stopIntent);
break;
default:
break;
}
}
};
}
运行输出结果:
注意:从以上输出可以看出,当第一次启动Service时,会调用该Service 的构造方法和onCreate()方法,而之后的再次启动Service 都不会再调用这两个方法了。只有当停止该Service 之后,再次启动Service 时,才会再次调用这两个方法。