每天进步一点,许多年后再回首就会发现现在的成就,是以前点滴努力的串联。
1.什么是service:
A Service is an application component representing either an application's desire to perform a longer-running operation while not interacting with the user or to supply functionality for other applications to use. Each service class must have a corresponding <service>
declaration in its package's AndroidManifest.xml
. Services can be started withContext.startService()
and Context.bindService()
.
service是一个应用程序组件,用来执行一个长时间运行的操作而不是与用户交互或提供其他应用程序使用的功能。每个service服务必须在AndroidManifest.xml
文件中注册
<service>
。可以使用Context.startService()
和
Context.bindService()方法启动一个sevice。
注意:service不是一个单独的进程,也不是一个线程。即service域ui共享一个线程,如果在service中执行耗时操作会导致主线程阻塞。
2.什么是intentservice:
IntentService is a base class for Service
s that handle asynchronous requests (expressed as Intent
s) on demand. Clients send requests through startService(Intent)
calls; the service is started as needed, handles each Intent in turn using a worker thread, and stops itself when it runs out of work.
intentservice是一个service的子类,提供异步请求处理intent。可以使用startService(Intent)启动它;当intentservice启动后,会使用一个work线程异步处理intent,每次只能处理一个intent。
3.效果演示:
创建service
public class ServiceTest extends Service {
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
System.out.println("=========service========="+Thread.currentThread().getId());
try {
//线程休眠10分钟
Thread.sleep(100000);
} catch (Exception e) {
e.printStackTrace();
}
return super.onStartCommand(intent, flags, startId);
}
}
创建intentservice
public class IntentServiceTest extends IntentService {
public IntentServiceTest(String name) {
super("test");
}
@Override
protected void onHandleIntent(Intent intent) {
System.out.println("=========intentservice========="+Thread.currentThread().getId());
try {
Thread.sleep(10000);
} catch (Exception e) {
e.printStackTrace();
}
}
}
创建两个按钮分别启动service和intentservice
public class MainActivity extends Activity {
private Button startservice=null;
private Button startintentservice=null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//打印当前线程id
System.out.println("=========ui主线程========="+Thread.currentThread().getId());
//实例化组件
startservice=(Button) findViewById(R.id.startservice);
startintentservice=(Button) findViewById(R.id.startintentservice);
//绑定监听事件
startservice.setOnClickListener(new MyOnclickListener());
startintentservice.setOnClickListener(new MyOnclickListener());
}
private class MyOnclickListener implements OnClickListener{
public void onClick(View v) {
if(v==startservice){
Intent service=new Intent();
service.setClass(MainActivity.this, ServiceTest.class);
startService(service);
}else if(v==startintentservice){
Intent service=new Intent();
service.setClass(MainActivity.this, IntentServiceTest.class);
startService(service);
}
}
}
首先启动service:线程被阻塞如图1:后台打印内容
11-19 01:53:08.300: INFO/System.out(226): =========ui主线程=========1
11-19 01:53:12.238: INFO/System.out(226): =========service=========1
启动intentservice:线程不阻塞但,多次点击同一个线程一次只处理一个intent,当处理完成后才会从队列中取出下一个执行。
intentService代码解析:
public abstract class IntentService extends Service {
private volatile Looper mServiceLooper;
private volatile ServiceHandler mServiceHandler;
private String mName;
private boolean mRedelivery;
private final class ServiceHandler extends Handler {
public ServiceHandler(Looper looper) {
super(looper);
}
@Override
public void handleMessage(Message msg) {
onHandleIntent((Intent)msg.obj);
stopSelf(msg.arg1);
}
}
public IntentService(String name) {
super();
mName = name;
}
/**
* Control redelivery of intents. If called with true,
* {@link #onStartCommand(Intent, int, int)} will return
* {@link Service#START_REDELIVER_INTENT} instead of
* {@link Service#START_NOT_STICKY}, so that if this service's process
* is called while it is executing the Intent in
* {@link #onHandleIntent(Intent)}, then when later restarted the same Intent
* will be re-delivered to it, to retry its execution.
*/
public void setIntentRedelivery(boolean enabled) {
mRedelivery = enabled;
}
@Override
public void onCreate() {
super.onCreate();
HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");
thread.start();
mServiceLooper = thread.getLooper();
mServiceHandler = new ServiceHandler(mServiceLooper);
}
@Override
public void onStart(Intent intent, int startId) {
Message msg = mServiceHandler.obtainMessage();
msg.arg1 = startId;
msg.obj = intent;
mServiceHandler.sendMessage(msg);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
onStart(intent, startId);
return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY;
}
@Override
public void onDestroy() {
mServiceLooper.quit();
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
/**
* Invoked on the Handler thread with the {@link Intent} that is passed to {@link #onStart}.
* Note that this will be invoked from a different thread than the one that handles the
* {@link #onStart} call.
*/
protected abstract void onHandleIntent(Intent intent);
}
比较:sevice处理不会自动开启线程,所以对于耗时操作例如mp3下载等需要开启新线程;intentservice会开启work线程处理,进行异步处理,但每次只有一个intent被处理。
- 描述: 图1
- 大小: 45.7 KB
分享到:
相关推荐
在Android应用开发中,`Service`和`IntentService`是两个关键组件,它们用于在后台执行长时间运行的任务,不依赖于用户界面。本篇将详细阐述`Service`和`IntentService`的用法以及需要注意的要点。 首先,我们来...
- **源码**:理解Service和IntentService的工作原理,需要阅读和分析Android系统的源代码,以便深入学习其内部机制。 - **工具**:开发过程中,可以利用Android Studio等IDE工具,以及调试工具进行服务的开发和测试...
1. 包括service例子 2. 包括IntentServiceServie 3. 在ServiceDemoActivity.java中都调用了两个service,调用service自行屏蔽调用...4. 仅仅是个例子,对比这个service和IntentServiceServie的区别。
在Android开发中,Service是用于实现应用程序在后台运行的关键组件,它可以持续运行,即使用户离开...因此,理解Service和IntentService的区别以及它们各自的适用场景,对于优化Android应用的性能和用户体验至关重要。
service中1需要手动开启子线程2服务开启之后会一直运行,需要手动调用stopService();或者stopSelf(); intentService是一种异步(子线程)、自动停止的服务,这个例子测试IntentService的特征
IntentService主要用于执行单一的任务或者一系列串行任务,而不会长时间占用主线程,提高了应用的响应速度和用户体验。 IntentService的核心特点是自动创建工作线程、处理Intent以及在任务完成后自动停止服务,这...
IntentService是Android系统中一种特殊的Service,它是Service的子类,设计用于在后台执行单一的任务,然后自动停止服务,不需要手动调用stopSelf()。IntentService的使用极大地简化了后台异步任务处理,并且保证了...
在Android开发中,IntentService是一个非常重要的组件,它主要用于处理后台执行的异步任务,而不会阻塞主线程。IntentService具有自动管理线程和停止服务的特性,使得开发者能够轻松地实现耗时操作,如网络请求、...
IntentService是Android系统提供的一种特殊服务,用于在后台执行单线程的任务,处理异步请求。它非常适合执行一次性任务,如网络请求、数据同步或耗时计算,且不会阻塞UI线程。IntentService的使用既简单又高效,...
再开始之前我们还是先介绍下service吧:此处用的是IntentService,至于和常规的service有什么区别呢? 有了Service为什么还要有个IntentService呢? 原因如下: 1)Service默认运行在主线程中,IntentService运行在一个...
在Android开发中,Service是四大组件之一,它在后台运行,不与用户界面直接交互,常用于执行长时间的任务,如播放音乐、网络通信等。本篇文章将深入解析"android service 简单实例源代码",帮助你理解如何在Android...
本篇文章将深入探讨“android学习之Service启动1”的主题,主要关注Service的启动方式及其基本用法。 首先,Service有两种启动模式:startService()和bindService()。`startService()`主要用于启动一个无需与调用者...
本篇文章将深入探讨“Android学习之路——7.Service”,分析Service的基本概念、使用方式以及常见应用场景,同时结合源码解析Service的工作原理,并提供一个实战Demo——Service_Demo。 一、Service基本概念 ...
在Android应用开发中,`Service` 是...综上所述,"Android学习之Service练习"涵盖了Android开发中不可或缺的一部分,通过实际操作,你可以更好地理解Service的工作原理和使用场景,为开发更复杂的应用打下坚实的基础。
在Android应用开发中,IntentService是一个非常重要的组件,它继承自Service类,专门用于执行后台的单线程任务,尤其适合处理那些可能阻塞主线程的操作,如网络请求、文件下载等。IntentService的设计旨在避免主线程...
Android SDK包含了一系列的库、工具和文档,使得开发者能够创建、构建、调试以及发布Android应用。主要组件包括: 1. **SDK Platform Tools**:包含了用于开发和调试的工具,如ADB(Android Debug Bridge)、AVD ...
Android中的Service分为两种类型:标准Service和IntentService。标准Service需要手动管理和停止,而IntentService则会自动处理工作队列并在任务完成时自我销毁。 2. **服务的生命周期**: Service的生命周期由...
在Android应用开发中,Service是四大组件之一,它在后台执行长时间运行的操作,不与用户交互。...在`ServiceDemo`项目中,我们可以看到如何创建和使用Start Service的实例,进一步学习和实践这些概念。