- Android 基础
- Android - 首页
- Android - 概述
- Android - 环境设置
- Android - 架构
- Android - 应用组件
- Android - Hello World 示例
- Android - 资源
- Android - 活动
- Android - 服务
- Android - 广播接收器
- Android - 内容提供器
- Android - 碎片
- Android - 意图/过滤器
- Android - 用户界面
- Android - UI 布局
- Android - UI 控件
- Android - 事件处理
- Android - 样式和主题
- Android - 自定义组件
- Android 高级概念
- Android - 拖放
- Android - 通知
- 基于位置的服务
- Android - 发送邮件
- Android - 发送短信
- Android - 电话呼叫
- 发布 Android 应用
- Android 有用示例
- Android - 警报对话框
- Android - 动画
- Android - 音频捕获
- Android - 音频管理器
- Android - 自动完成
- Android - 最佳实践
- Android - 蓝牙
- Android - 相机
- Android - 剪贴板
- Android - 自定义字体
- Android - 数据备份
- Android - 开发者工具
- Android - 模拟器
- Android - Facebook 集成
- Android - 手势
- Android - Google 地图
- Android - 图像效果
- Android - ImageSwitcher
- Android - 内部存储
- Android - JetPlayer
- Android - JSON 解析器
- Android - Linkedin 集成
- Android - 加载微调器
- Android - 本地化
- Android - 登录屏幕
- Android - MediaPlayer
- Android - 多点触控
- Android - 导航
- Android - 网络连接
- Android - NFC 指南
- Android - PHP/MySQL
- Android - 进度圆圈
- Android - 进度条
- Android - 推送通知
- Android - RenderScript
- Android - RSS 阅读器
- Android - 屏幕录制
- Android - SDK 管理器
- Android - 传感器
- Android - 会话管理
- Android - 共享首选项
- Android - SIP 协议
- Android - 拼写检查器
- Android - SQLite 数据库
- Android - 支持库
- Android - 测试
- Android - 文字转语音
- Android - TextureView
- Android - Twitter 集成
- Android - UI 设计
- Android - UI 模式
- Android - UI 测试
- Android - WebView 布局
- Android - Wi-Fi
- Android - 小部件
- Android - XML 解析器
- Android 有用资源
- Android - 问答
- Android - 有用资源
- Android - 讨论
Android - 服务
服务是一个在后台运行以执行长时间运行的操作的组件,而无需与用户交互,即使应用程序被销毁,它也能工作。服务基本上可以处于两种状态:
序号 | 状态和描述 |
---|---|
1 |
已启动 当应用程序组件(例如活动)通过调用startService()启动服务时,服务就会启动。启动后,服务可以在后台无限期运行,即使启动它的组件被销毁也是如此。 |
2 |
绑定 当应用程序组件通过调用bindService()绑定到服务时,服务就会绑定。绑定服务提供了一个客户端-服务器接口,允许组件与服务交互,发送请求,获取结果,甚至通过进程间通信 (IPC) 在进程之间进行交互。 |
服务具有生命周期回调方法,您可以实现这些方法来监视服务状态的变化,并且可以在适当的阶段执行工作。左侧的以下图表显示了使用startService()创建服务时的生命周期,右侧的图表显示了使用bindService()创建服务时的生命周期:(图片来自:android.com)
要创建服务,您可以创建一个扩展Service基类或其现有子类的Java类。Service基类定义了各种回调方法,其中最重要的列在下面。您不需要实现所有回调方法。但是,了解每个方法并实现确保您的应用按用户预期的方式运行的方法非常重要。
序号 | 回调和描述 |
---|---|
1 | onStartCommand() 当另一个组件(例如活动)通过调用startService()请求启动服务时,系统会调用此方法。如果您实现了此方法,则有责任在服务完成工作时通过调用stopSelf()或stopService()方法停止服务。 |
2 |
onBind() 当另一个组件想要通过调用bindService()与服务绑定时,系统会调用此方法。如果您实现了此方法,则必须提供客户端用来与服务通信的接口,方法是返回一个IBinder对象。您必须始终实现此方法,但如果您不想允许绑定,则应返回null。 |
3 |
onUnbind() 当所有客户端都已断开与服务发布的特定接口的连接时,系统会调用此方法。 |
4 |
onRebind() 当新的客户端在之前已在onUnbind(Intent)中收到所有客户端都已断开连接的通知后连接到服务时,系统会调用此方法。 |
5 |
onCreate() 当服务首次使用onStartCommand()或onBind()创建时,系统会调用此方法。此调用是执行一次性设置所必需的。 |
6 |
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 服务。按照以下步骤修改我们在Hello World 示例章节中创建的 Android 应用程序:
步骤 | 描述 |
---|---|
1 | 您将使用 Android Studio IDE 创建一个 Android 应用程序,并在包com.example.tutorialspoint7.myapplication下将其命名为我的应用程序,如Hello World 示例章节中所述。 |
2 | 修改主活动文件MainActivity.java以添加startService()和stopService()方法。 |
3 | 在包com.example.My Application下创建一个新的 Java 文件MyService.java。此文件将包含与 Android 服务相关的方法的实现。 |
4 | 使用<service.../>标签在AndroidManifest.xml文件中定义您的服务。应用程序可以拥有一个或多个服务,没有任何限制。 |
5 | 修改res/layout/activity_main.xml文件的默认内容,以在线性布局中包含两个按钮。 |
6 | 无需更改res/values/strings.xml文件中的任何常量。Android Studio 会处理字符串值 |
7 | 运行应用程序以启动 Android 模拟器并验证对应用程序所做的更改的结果。 |
以下是修改后的主活动文件MainActivity.java的内容。此文件可以包含每个基本生命周期方法。我们添加了startService()和stopService()方法来启动和停止服务。
package com.example.tutorialspoint7.myapplication; import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.os.Bundle; import android.app.Activity; import android.util.Log; import android.view.View; public class MainActivity extends Activity { String msg = "Android : "; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Log.d(msg, "The onCreate() event"); } 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)); } }
以下是MyService.java的内容。此文件可以根据需要包含一个或多个与服务关联的方法的实现。目前,我们将仅实现onStartCommand()和onDestroy()两个方法:
package com.example.tutorialspoint7.myapplication; import android.app.Service; import android.content.Intent; import android.os.IBinder; import android.support.annotation.Nullable; import android.widget.Toast; /** * Created by TutorialsPoint7 on 8/23/2016. */ public class MyService extends Service { @Nullable @Override public IBinder onBind(Intent intent) { 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文件的修改内容。在这里,我们添加了<service.../>标签以包含我们的服务:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.tutorialspoint7.myapplication"> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <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/layout/activity_main.xml文件的内容,其中包含两个按钮:
<RelativeLayout 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:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Example of services" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:textSize="30dp" /> <TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Tutorials point " android:textColor="#ff87ff09" android:textSize="30dp" android:layout_above="@+id/imageButton" android:layout_centerHorizontal="true" android:layout_marginBottom="40dp" /> <ImageButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/imageButton" android:src="@drawable/abc" android:layout_centerVertical="true" android:layout_centerHorizontal="true" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/button2" android:text="Start Services" android:onClick="startService" android:layout_below="@+id/imageButton" android:layout_centerHorizontal="true" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Stop Services" android:id="@+id/button" android:onClick="stopService" android:layout_below="@+id/button2" android:layout_alignLeft="@+id/button2" android:layout_alignStart="@+id/button2" android:layout_alignRight="@+id/button2" android:layout_alignEnd="@+id/button2" /> </RelativeLayout>
让我们尝试运行我们刚刚修改的Hello World!应用程序。我假设您在进行环境设置时创建了您的AVD。要从 Android Studio 运行应用程序,请打开项目的某个活动文件,然后单击工具栏中的运行图标。Android Studio 将应用程序安装到您的 AVD 并启动它,如果您的设置和应用程序一切正常,它将显示以下模拟器窗口:
现在要启动您的服务,让我们单击启动服务按钮,这将启动服务,并且根据我们在onStartCommand()方法中的编程,消息服务已启动将出现在模拟器的底部,如下所示:
要停止服务,您可以单击停止服务按钮。