在安卓系统中,service是运行在主线程中的,而thread是用来创建子线程的。二者毫无关系! thread的运行时独立于activity的,当一个activity被销毁时,如果你没有主动停止 Thread 或者 Thread 里的 run 方法没有执行完毕的话,Thread 也会一直执行。当 Activity 被 finish 之后,你不再持有该 Thread 的引用。另一方面,你没有办法在不同的 Activity 中对同一 Thread 进行控制。 但是service却不同,当一个activity被销毁时,另外的activity还可以对service进行控制。因为任何 Activity 都可以控制同一 Service,而系统也只会创建一个对应 Service 的实例。因此可以把 Service 想象成一种消息服务,而你可以在任何有 Context 的地方调用 Context.startService、Context.stopService、 Context.bindService,Context.unbindService,来控制它,你也可以在 Service 里注册 BroadcastReceiver,在其他地方通过发送 broadcast 来控制它,当然这些都是 Thread 做不到的。
service
Service的生命周期方法比Activity少一些,只有onCreate, onStart(onStartCommand), onDestroy
我们有两种方式启动一个Service,他们对Service生命周期的影响是不一样的。
1.通过startService启动
Service会经历 onCreate --> onStart(onStartCommand)
stopService的时候直接onDestroy
如果是 调用者 直接退出而没有调用stopService的话,Service会一直在后台运行。
下次调用者再起来仍然可以stopService。
2.通过bindService启动
Service只会运行onCreate, 这个时候 调用者和Service绑定在一起
调用者退出了,Srevice就会调用onUnbind-->onDestroyed
所谓绑定在一起就共存亡了。
一个bindService启动的例子:
ServiceDemo.java
public class ServiceDemo extends Activity { Button btnBind, btnUnBind, btnGetServiceStatus; BindService bindService; LocalService localService; private boolean isBind = false; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); btnBind = (Button) findViewById(R.id.btnBind); btnUnBind = (Button) findViewById(R.id.btnUnBind); btnGetServiceStatus = (Button) findViewById(R.id.btnGetServiceStatus); OnClickListener listener = new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub switch (v.getId()) { case R.id.btnBind: // Intent intent = new Intent(); // // 隐式启动Service // intent.setAction("com.wang.servicedemo.BIND_SERVICE"); // 显示启动Service Intent intent = new Intent(ServiceDemo.this, BindService.class); // 绑定指定的Service bindService(intent, serviceConnection, BIND_AUTO_CREATE); isBind = true; break; case R.id.btnUnBind: if (isBind) { // 解除绑定Service,一般要是没有主动去解绑的话,可以在onDestory方法中解绑 unbindService(serviceConnection); isBind = false; bindService = null; Toast.makeText(ServiceDemo.this, "--Service is Unbind.--", Toast.LENGTH_LONG) .show(); } else { Toast.makeText(ServiceDemo.this, "--你还未绑定Service--", Toast.LENGTH_LONG).show(); } break; case R.id.btnGetServiceStatus: if (bindService == null) { Toast.makeText(ServiceDemo.this, "请先绑定Service", Toast.LENGTH_LONG).show(); } else { Toast.makeText( ServiceDemo.this, "App name:" + bindService.getDemoName() + "\n count:" + localService.getCount(), Toast.LENGTH_LONG).show(); // localService.getService().MyMethod(); } break; } } }; btnBind.setOnClickListener(listener); btnGetServiceStatus.setOnClickListener(listener); btnUnBind.setOnClickListener(listener); } /** * 定义一个ServiceConnection对象, 实例化ServiceConnection接口的实现类, * 重写onServiceConnected()和onServiceDisconnected()方法 */ private ServiceConnection serviceConnection = new ServiceConnection() { // 当Activity与Service通过非UnBind()方法断开连接的时候回调该方法 @Override public void onServiceDisconnected(ComponentName name) { bindService = null; Toast.makeText(ServiceDemo.this, "--Service UnConnected.--", Toast.LENGTH_LONG).show(); } // 当Activity与Service连接成功的时候回调该方法 @Override public void onServiceConnected(ComponentName name, IBinder service) { // 获取getService()方法返回的BindService对象 localService = ((LocalService) service); bindService = localService.getService(); bindService.MyMethod(); Toast.makeText(ServiceDemo.this, "--Service Connected.--", Toast.LENGTH_LONG).show(); System.out.println("--Service Connected.--"); } }; }
BindService.java
public class BindService extends Service { private int count = 0; private boolean isQuit = false; // 定义getService方法返回的对象 public LocalService localService = new LocalService(); /* * 创建Binder子类,Binder实现了IBinder接口, 这是一个内部类 */ public class LocalService extends Binder { public int getCount() { return count; } public BindService getService() { return BindService.this; } } /* * Service子类必须实现的方法,绑定该Service时回调的方法; onbind方法只被调用一次,在第一个client或调用者 * 绑定至其的时候被调用。 返回的是Binder对象。 然后其他组件可以通过这个Binder 对象与该service 进行通讯。 */ @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return localService; } /* * (non-Javadoc) 此方法只执行一次,当service再次被调用时,会执行onStartCommand方法 * * @see android.app.Service#onCreate() */ @Override public void onCreate() { // TODO Auto-generated method stub System.out.println("Service is Created."); // 创建并启动一个线程,动态修改count变量值 new Thread() { @Override public void run() { // TODO Auto-generated method stub while (!isQuit) { try { Thread.sleep(1000);// 使得当前线程休眠1000毫秒 } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } count++; } } }.start(); super.onCreate(); } /* * (non-Javadoc)onStart方法已被onStartCommand方法代替,api不赞成使用 * * @see android.app.Service#onStart(android.content.Intent, int) */ @Override @Deprecated public void onStart(Intent intent, int startId) { // TODO Auto-generated method stub super.onStart(intent, startId); } @Override public int onStartCommand(Intent intent, int flags, int startId) { // TODO Auto-generated method stub return super.onStartCommand(intent, flags, startId); } // 在所有onUnbind被回调之后调用 @Override public void onDestroy() { // TODO Auto-generated method stub System.out.println("Service is Destroyed."); isQuit = true; super.onDestroy(); } // 定义一个返回实例名的方法 public String getDemoName() { return "Service实例"; } // 在所有与Service绑定的客户端都解除绑定之后被回调 @Override public boolean onUnbind(Intent intent) { // TODO Auto-generated method stub System.out.println("Service is Unbind."); return true;// 表示下次客户端绑定的时候接受一个onRebind()的调用(而不是调用 onBind()) } public void MyMethod() { for (int i = 0; i < 100; i++) { Log.i("44", "BindService-->MyMethod()"); } } }
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" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.wang.servicedemo.MainActivity" > <Button android:id="@+id/btnBind" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="绑定service" /> <Button android:id="@+id/btnGetServiceStatus" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="获得service状态" /> <Button android:id="@+id/btnUnBind" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="解绑service" /> </LinearLayout>
最后在清单文件中声明service:
<service android:name="com.wang.servicedemo.BindService" > <intent-filter> <!-- 为该Service组件的intent-filter配置action ,用于隐式启动时使用--> <action android:name="com.wang.servicedemo.BIND_SERVICE" > </action> </intent-filter> </service>
相关推荐
项目名"ServiceToast"可能表示这是一个关于如何在`Service`中使用`Thread`和`Handler`来显示`Toast`的示例。开发者可能通过创建一个新的`Thread`,在该线程中执行任务,并使用`Handler`将完成任务的消息传回主线程,...
总之,Service和Toast在Android开发中都有其独特的应用场景。理解它们的使用方法和注意事项,对于构建高效、稳定的应用至关重要。通过“android service toast 01”这个项目,开发者可以深入学习Android后台服务的...
在Android开发中,Service是一种非常重要的组件,它可以在后台长时间运行,执行一些不需要与用户交互的任务。本示例中,我们关注的是如何利用Service来实现资源的异步下载,并且在下载完成后对ZIP文件进行解压。这个...
总结起来,Android Service提供了多种启动方式,根据应用场景选择合适的方式可以优化性能和用户体验。启动方式适用于无需频繁交互的后台任务,绑定方式适用于需要与Service紧密交互的情况,线程方式确保Service不会...
Android中的Service分为两种类型:标准Service和IntentService。标准Service需要手动管理和停止,而IntentService则会自动处理工作队列并在任务完成时自我销毁。 2. **服务的生命周期**: Service的生命周期由...
在Android应用开发中,...NowwellDownloadDemo3这个文件可能包含了一个完整的示例项目,你可以详细研究其中的代码,进一步理解Android Service如何实现下载和进度更新。记得在真实设备或模拟器上测试,确保功能正常。
在“android service反馈到主线程更新界面”这个主题中,我们主要探讨的是如何利用Service和Handler机制,实现在后台服务中执行任务,并将结果实时反馈到主线程以更新UI。 首先,Service的基本概念是:它是一个没有...
Service与Thread的区别在于,Thread是程序执行的基本单元,而Service是Android系统的一个组件。Thread在单独的线程中执行,不受Activity生命周期的影响,但当Activity被销毁时,若未正确管理Thread,可能导致内存...
Service 和 Thread 在 Android 开发中都是处理后台任务的重要组件,但它们的作用和使用场景有着显著的区别。Service 是 Android 系统提供的一种机制,主要用于在后台长时间运行任务,而不需要直接与用户界面交互。...
在Android应用开发中,Service是四大组件之一,用于在后台执行长时间运行的操作,不与用户交互。本篇文章将深入探讨Service的手动重启、自动重启以及在特殊条件下的重启策略,帮助开发者更好地理解和管理Service的...
综上所述,理解并熟练运用Android Service进行本地服务操作,包括回调机制、后台线程的数据处理以及批量处理,是提升Android应用性能和用户体验的关键。开发者需要确保Service正确地管理其生命周期,避免内存泄漏,...
本教程将专注于如何利用Android服务(Service)来实现这一目标。Service是Android系统中的一个组件,它能够在后台运行,即使用户离开了应用程序,服务仍然可以继续执行其任务。 **一、创建Service** 首先,我们...
在Android应用开发中,Service和线程是两个至关重要的概念,它们是实现后台运行任务和优化资源管理的关键。 **一、Android SDK** Android SDK包含了一系列的库、工具和文档,使得开发者能够创建、构建、调试以及...
在Android应用开发中,`Service` 是一个用于执行长时间运行操作的组件,它不提供用户界面,但可以与用户界面组件交互。`Service` 通常用于在后台执行任务,如播放音乐、网络通信等。然而,由于主线程(UI线程)主要...
在Android应用开发中,`Service` 是一个非常重要的组件,用于执行长时间运行的操作,比如后台音乐播放、文件下载等。本篇文章将详细讲解如何利用`Service` 实现带有进度条的文件下载功能。 首先,我们需要创建一个`...
本话题将深入探讨如何在Android Studio中创建和管理Service,使其在应用退出后仍能继续运行,并实现开机自启动,以保持应用的后台存活。 一、Service基础 1. 创建Service: 在Android Studio中,可以通过右键项目 -...
Service是Android系统中的一个重要组件,它是后台运行的程序,不提供用户界面,主要用于执行长时间运行的任务,例如播放音乐、网络通信、定期数据同步等。在Android应用开发中,Service的使用是不可或缺的一部分,...
在Android开发中,实现应用程序的自动更新是一项常见的需求,它能确保用户始终使用的是最新版本的应用,从而获得最佳的功能和安全性能。本示例“Android高级应用源码-app更新,实现service下载.zip”提供了一个使用...
同时,Service运行在主线程中,如果Service需要执行耗时操作,应避免阻塞主线程,可能会考虑使用IntentService或使用Thread、HandlerThread来处理后台任务。 Service运行时,即使应用的UI界面被关闭,Service仍然...
## Android服务Service详解 ### 8.1 Service起步 Service是Android应用程序组件的重要组成部分,它主要用于在后台执行任务,不依赖于用户界面。Service通常用于执行长时间运行的操作,如下载数据、播放音乐或处理...