Android Service组件在后台不可见,但一般情况下是与其他组件一同运行在一个进程中的(Local Service与其他部分在一个进程,Remote Service单独开进程),而且在主线程中,并不单独启动一个线程(除非程序员自己另外开线程)
Service组件提供了后台执行某些功能以及为其他应用程序提供服务,提供支撑功能的能力。
生命周期:OnCreate()->OnStartCommand()->OnDestroy()。
调用 Context.startService()可以多次调用,但只要调用stopService一次就会stop.多次调用startService或者bindService不会启动多个服务。
local service样例
public class LocalService extends Service {
private NotificationManager mNM;
// Unique Identification Number for the Notification.
// We use it on Notification start, and to cancel it.
private int NOTIFICATION = R.string.local_service_started;
/**
* Class for clients to access. Because we know this service always
* runs in the same process as its clients, we don't need to deal with
* IPC.
*/
public class LocalBinder extends Binder {
LocalService getService() {
return LocalService.this;
}
}
@Override
public void onCreate() {
mNM = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
// Display a notification about us starting. We put an icon in the status bar.
showNotification();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i("LocalService", "Received start id " + startId + ": " + intent);
// We want this service to continue running until it is explicitly
// stopped, so return sticky.
return START_STICKY;
}
@Override
public void onDestroy() {
// Cancel the persistent notification.
mNM.cancel(NOTIFICATION);
// Tell the user we stopped.
Toast.makeText(this, R.string.local_service_stopped, Toast.LENGTH_SHORT).show();
}
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
// This is the object that receives interactions from clients. See
// RemoteService for a more complete example.
private final IBinder mBinder = new LocalBinder();
/**
* Show a notification while this service is running.
*/
private void showNotification() {
// In this sample, we'll use the same text for the ticker and the expanded notification
CharSequence text = getText(R.string.local_service_started);
// Set the icon, scrolling text and timestamp
Notification notification = new Notification(R.drawable.stat_sample, text,
System.currentTimeMillis());
// The PendingIntent to launch our activity if the user selects this notification
PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
new Intent(this, LocalServiceActivities.Controller.class), 0);
// Set the info for the views that show in the notification panel.
notification.setLatestEventInfo(this, getText(R.string.local_service_label),
text, contentIntent);
// Send the notification.
mNM.notify(NOTIFICATION, notification);
}
}
调用
private LocalService mBoundService;
private ServiceConnection mConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName className, IBinder service) {
// This is called when the connection with the service has been
// established, giving us the service object we can use to
// interact with the service. Because we have bound to a explicit
// service that we know is running in our own process, we can
// cast its IBinder to a concrete class and directly access it.
mBoundService = ((LocalService.LocalBinder)service).getService();
// Tell the user about this for our demo.
Toast.makeText(Binding.this, R.string.local_service_connected,
Toast.LENGTH_SHORT).show();
}
public void onServiceDisconnected(ComponentName className) {
// This is called when the connection with the service has been
// unexpectedly disconnected -- that is, its process crashed.
// Because it is running in our same process, we should never
// see this happen.
mBoundService = null;
Toast.makeText(Binding.this, R.string.local_service_disconnected,
Toast.LENGTH_SHORT).show();
}
};
void doBindService() {
// Establish a connection with the service. We use an explicit
// class name because we want a specific service implementation that
// we know will be running in our own process (and thus won't be
// supporting component replacement by other applications).
bindService(new Intent(Binding.this,
LocalService.class), mConnection, Context.BIND_AUTO_CREATE);
mIsBound = true;
}
void doUnbindService() {
if (mIsBound) {
// Detach our existing connection.
unbindService(mConnection);
mIsBound = false;
}
}
@Override
protected void onDestroy() {
super.onDestroy();
doUnbindService();
}
在Activity中通过mBoundService调用Service中的public方法来获取后台数据,实际上onServiceConnected中返回的是一个IBinder对象,只不过我们在此已经确定Local Service
已经在执行了,可以进行强制类型转换。
Local Service可以通过发送广播来给前台提供后台数据更新,前台只需要注册一个Receiver既可以与Service通讯。
例子:
后台Service的某个方法进行数据更新后执行
Intent intent = new Intent("XXXX_Message");
sendBroadcast(intent); 通知前台数据已经更新
前台
private MessageReceiver receiver;
class MessageReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context arg0, Intent arg1) {
String action = arg1.getAction();
if (action.equals("XXXX_Message")) {
//从Service接收广播消息
String msgStr = arg1.getStringExtra("msg_str");
}
}
}
@Override
protected void onResume() {
super.onResume();
IntentFilter filter = new IntentFilter("XXXX_Message");
if (receiver == null)
receiver = new MessageReceiver();
//注册BroadcastReceiver
registerReceiver(receiver, filter);
}
@Override
protected void onPause() {
unregisterReceiver(receiver);
super.onPause();
}
分享到:
相关推荐
总结起来,Android的Service和Timer是强大的工具,它们可以帮助开发者实现在后台的定时任务。正确地使用它们,可以提高应用的功能性和用户体验。然而,需要注意的是,频繁的后台操作可能会消耗较多的系统资源,因此...
总结来说,通过研究WordPress-Android-develop项目,开发者可以学习到Android应用的基本架构,如何利用WordPress REST API,使用网络请求库进行数据交互,本地数据存储的方法,UI设计技巧,以及安全性和权限管理的...
在Android系统中,Service是四大组件之一,它用于在后台执行长时间运行的操作,不与用户界面...通过阅读博客“android笔记--Service与AIDL”,开发者可以深入了解这两个组件的原理和使用技巧,提升Android开发能力。
总结来说,"native-service-master.zip"提供的示例项目旨在帮助开发者学习如何在Android平台上创建和管理原生服务,包括使用JNI、NDK、AIDL以及处理线程和同步问题。这个项目将提供实践操作经验,加深对Android ...
项目中的XML布局文件展示了Android界面设计的方法,包括如何使用LinearLayout、RelativeLayout、ConstraintLayout等布局,以及自定义View和Adapter的实现。 8. **测试与调试** 了解项目的测试代码,可以学习单元...
在Android平台上进行Web服务(尤其是基于SOAP的Web Service)的交互时,开发者通常会使用到一个名为ksoap2-android的库。标题中的"ksoap2-android-3.6.2 for WebService"指的是这个库的一个特定版本,即3.6.2。ksoap...
- 创建Service:通过继承`android.app.Service`并重写其生命周期方法,如`onStartCommand()`和`onBind()`。 - 启动Service:通过`startService()`启动,仅执行一次任务,不需要返回结果。 - 绑定Service:通过`...
总结来说,"gpio-android-api"是一个关于Android平台上GPIO接口使用的教程或库,涵盖了从驱动开发到Java应用层的完整流程,特别是针对LED控制的应用。通过学习这个API,开发者可以掌握如何在Android设备上进行硬件...
总结来说,这个项目涉及了Android应用开发的多个高级领域,包括JNI、Service、串口通信、Socket通信以及USB驱动开发,对于提升Android开发者在硬件交互方面的技能非常有帮助。通过阅读和分析提供的源码,开发者可以...
本篇文章将深入探讨`startService`类型的Android Service,通过一个简单的实例来展示其工作原理和使用方法。 `Service`分为两种主要类型:`Start Service`和`Bound Service`。`Start Service`主要用于执行非交互式...
本示例"Android Service大总结Demo"将深入探讨Service的使用,包括如何启动、绑定服务,以及实现跨进程间的通信。我们将详细讲解以下几个关键知识点: 1. **Service的基本概念**: - Service是一种没有用户界面的...
总结来说,“android service”是Android开发中的核心概念,它支持后台运行,是实现持久化操作的关键。通过深入学习Service的源码,结合各种工具进行调试和分析,开发者可以更高效地利用Service实现复杂的功能,同时...
本教程将深入探讨Android Service的基本用法,通过一个名为"ServiceDemo"的示例项目来阐述关键概念。 首先,创建一个新的Android工程并添加一个Service。在AndroidManifest.xml文件中声明Service,例如: ```xml ...
理解并掌握组件化的理念和实践方法,对于提升Android开发者的技术水平和项目管理能力具有重要意义。对于`AndroidComponent-master`这个项目,你可以下载源码进行深入研究,了解其具体的实现方式和技巧。
总结,理解Service的启动与停止机制以及生命周期管理对于优化Android应用性能和用户体验至关重要。通过源码学习,可以更深入地了解Service的工作原理,并在实际项目中做出更优的决策。在实践中,要始终遵循最佳实践...
### 《忙碌程序员的安卓开发指南》核心知识点总结 #### 一、书籍概述与作者介绍 **《忙碌程序员的安卓开发指南》**是一本由**Mark L. Murphy**编写的关于Android开发的专业书籍。该书版权归属于CommonsWare, LLC,...
首先,在你的Android项目中创建一个`.aidl`文件,例如`IRemoteService.aidl`。在该文件中,定义你需要暴露给其他进程的方法。例如: ```aidl package com.example.aidlexample; interface IRemoteService { ...
2. **基础语法与布局设计**:学习Java语言基础,理解Android应用程序的四大组件(Activity、Service、BroadcastReceiver、ContentProvider)的用法。同时,掌握XML布局文件的编写,了解各种视图组件(TextView、...
总结起来,Start Service是Android中用于启动后台任务的重要工具,正确理解和使用它可以提升应用的用户体验,但同时也需要注意资源管理和生命周期管理,以保证应用的稳定性和效率。在`ServiceDemo`项目中,我们可以...
总结一下,`startService()`是Android中启动服务的关键方法,适用于需要后台长期运行的任务。理解并正确使用服务可以极大地增强你的应用功能,但也要注意资源管理,避免过度消耗设备资源。通过学习和实践`Android_...