服务是一个在后台运行的组件执行长时间运行的操作,而不需要与用户进行交互。 例如,一个服务可能在后台播放音乐时,在不同的应用程序中,用户也可以通过网络获取数据没有阻止用户交互活动。 服务基本上可以两种状态:
状态 | 描述 |
---|---|
开始 | 服务是 开始 当一个应用程序组件,如一个活动,它通过调用开始 由startService() 。 一旦开始,一个服务可以无限期地在后台运行,即使开始它的组件被摧毁。 |
绑定 | 服务是 绑定 当一个应用程序组件绑定到它通过调用 bindService() 。 绑定服务提供了一个客户机-服务器接口,允许组件与服务交互,发送请求,得到结果,甚至跨进程与进程间通信(IPC)。 |
服务生命周期回调方法,您可以实现监控服务状态的变化,你可以在适当的阶段执行工作。 下图左边显示了生命周期创建服务时,由startService()和右边的图显示了生命周期创建服务时,bindService(): (图片来源:android.com)
要创建一个服务,您创建一个Java类,它扩展了现有服务基类或它的一个子类。 的 服务 基类定义了各种回调方法和最重要的是下面。 你不需要实现所有的回调方法。 然而,重要的是你了解每一个和实施那些确保应用程序行为用户期望的方式。
回调 | 描述 |
---|---|
onStartCommand() | 系统调用这个方法当另一个组件,比如一个活动,要求服务启动,通过调用 由startService() 。 如果你实现这个方法,你有责任停止服务工作完成后,通过调用stopSelf() 或 stopService() 方法。 |
onBind() | 系统调用此方法时想绑定与服务通过调用另一个组件 bindService() 。 如果你实现这个方法,你必须提供一个接口,客户使用与服务进行通信,通过返回一个 内部 对象。 你必须实现这个方法,但是如果你不希望允许绑定,那么你应该返回 空 。 |
onUnbind() | 系统调用此方法时,所有客户都与一个特定的接口发布的服务。 |
onRebind() | 系统调用该方法当新客户连接到服务,以前通知后,所有的分离 onUnbind(意图) 。 |
onCreate() | 系统调用这个方法时使用创建的服务是第一 onStartCommand() 或 onBind() 。 这个电话是需要执行一次性的设置。 |
onDestroy() | 系统调用此方法不再使用服务时,被摧毁了。 您的服务应该实现这个清理任何资源,如线程注册侦听器,接收器,等等。 |
以下框架服务演示了每个生命周期的方法:
package com.tutorialspoint;
import android.app.Service;
import android.os.IBinder;
import android.content.Intent;
import android.os.Bundle;
public class HelloService extends Service {
/** indicates how to behave if the service is killed */
int mStartMode;
/** interface for clients that bind */
IBinder mBinder;
/** indicates whether onRebind should be used */
boolean mAllowRebind;
/** Called when the service is being created. */
@Override
public void onCreate() {
}
/** The service is starting, due to a call to startService() */
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return mStartMode;
}
/** A client is binding to the service with bindService() */
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
/** Called when all clients have unbound with unbindService() */
@Override
public boolean onUnbind(Intent intent) {
return mAllowRebind;
}
/** Called when a client is binding to the service with bindService()*/
@Override
public void onRebind(Intent intent) {
}
/** Called when The service is no longer used and is being destroyed */
@Override
public void onDestroy() {
}
}
例子
这个例子将带你通过简单的步骤来展示如何创建自己的Android服务。 按照以下步骤修改我们创建的Android应用程序 Hello World示例 一章:
一步 | 描述 |
---|---|
1 | 您将使用Eclipse IDE创建一个Android应用程序和名称 HelloWorld 在一个包com.example.helloworld 的解释 Hello World示例 一章。 |
2 | 修改主要活动文件 MainActivity.java 添加 由startService() 和 stopService() 方法。 |
3 | 创建一个新的java文件 MyService.java 下包 com.example.helloworld 。 这个文件将会实现的Android服务相关的方法。 |
4 | 定义你的服务 AndroidManifest.xml 文件使用<服务…… / >标记。 应用程序可以有一个或多个服务,没有任何限制。 |
5 | 修改的detault内容 res /布局/ activity_main.xml 文件包含两个按钮在线性布局。 |
6 | 定义两个常量 start_service 和 stop_service 在 res /价值/ strings.xml 文件 |
7 | 运行应用程序推出Android模拟器并验证在态变化的结果。 |
以下是修改后的主要活动文件的内容 src / com.example.helloworld / MainActivity.java 。 这个文件可以包含的每一个基本的生命周期方法。 我们已经添加了 由startService() 和 stopService() 方法来启动和停止服务。
package com.example.helloworld;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.content.Intent;
import android.view.View;
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
// Method to start the service
public void startService(View view) {
startService(new Intent(getBaseContext(), MyService.class));
}
// Method to stop the service
public void stopService(View view) {
stopService(new Intent(getBaseContext(), MyService.class));
}
}
下面的内容 src / com.example.helloworld / MyService.java 。 这个文件可以实现与服务相关联的一个或多个方法基于需求。 现在我们要实现只有两个方法 onStartCommand() 和 onDestroy() :
package com.example.helloworld;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.widget.Toast;
public class MyService extends Service {
@Override
public IBinder onBind(Intent arg0) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// Let it continue running until it is stopped.
Toast.makeText(this, "Service Started", Toast.LENGTH_LONG).show();
return START_STICKY;
}
@Override
public void onDestroy() {
super.onDestroy();
Toast.makeText(this, "Service Destroyed", Toast.LENGTH_LONG).show();
}
}
后将修改后的内容 AndroidManifest.xml 文件。 这里我们有添加<服务… / >标记包含我们的服务:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.helloworld"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="15" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/title_activity_main" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<service android:name=".MyService" />
</application>
</manifest>
以下的内容 res /布局/ activity_main.xml 文件包含两个按钮:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<Button android:id="@+id/btnStartService"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/start_service"
android:onClick="startService"/>
<Button android:id="@+id/btnStopService"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/stop_service"
android:onClick="stopService" />
</LinearLayout>
以下的内容 res /价值/ strings.xml 定义两个新的常量:
<resources>
<string name="app_name">HelloWorld</string>
<string name="hello_world">Hello world!</string>
<string name="menu_settings">Settings</string>
<string name="title_activity_main">MainActivity</string>
<string name="start_service">Start Service</string>
<string name="stop_service">Stop Service</string>
</resources>
让我们尝试运行修改 你好世界! 应用我们只是修改。 我假设您已经创建了您 AVD中 在做环境设置。 从Eclipse运行应用程序,打开一个项目的活动文件并单击run 从工具栏图标。 AVD的Eclipse安装应用程序和启动它,如果一切都好与你的设置和应用程序,它将显示以下模拟器窗口:
现在开始你的服务,让我们点击 开始服务 按钮,这将启动该服务,按我们的编程 onStartCommand() 方法,一个消息 服务开始 将出现在底部的模拟器如下:
停止服务,您可以单击按钮停止服务。