开门见山

开启服务有三种情况:假设直接使用服务,则没有必要进行绑定,可是假设要使用服务里面的方法。则要进行绑定。

具体的启动情况有下:
①调用startService()。再调用stopService()
②单独调用bindService()方法,再unbindService()后,以运行服务内部的方法。
③先调用startService(),再调用bindService()方法,再调用unbindService()。最后调用stopService()

特殊情况:
仅仅要使用了bindService,无论之后是否解绑和停止服务,都能够调用服务中的方法

以下针对这三种启动顺序分别做具体说明。

在解说之前先贴一下代码:

MyService类。里面就不加凝视了

  1. public class MyService extends Service {
  2. @Override
  3. public IBinder onBind(Intent intent) {
  4. return new MyBinder();
  5. }
  6. @Override
  7. public void onCreate() {
  8. System.out.println("MyService onCreate():Called by the system when the service is first created");
  9. super.onCreate();
  10. }
  11. @Override
  12. public boolean onUnbind(Intent intent) {
  13. System.out.println("MyService onUnbind():Called when all clients have disconnected from a particular interface published by the service.");
  14. return super.onUnbind(intent);
  15. }
  16. @Override
  17. public int onStartCommand(Intent intent, int flags, int startId) {
  18. System.out.println("MyService onStartCommand():Called by the system every time a client explicitly starts the service by calling android.content.Context.startService, providing the arguments it supplied and a unique integer token representing the start request.");
  19. return super.onStartCommand(intent, flags, startId);
  20. }
  21. @Override
  22. public void onDestroy() {
  23. System.out.println("MyService onDestroy():Called by the system to notify a Service that it is no longer used and is being removed. ");
  24. super.onDestroy();
  25. }
  26. public void method1() {
  27. System.out.println("MyService is method1");
  28. }
  29. public void method2() {
  30. System.out.println("MyService is method2");
  31. }
  32. class MyBinder extends Binder {
  33. public void callMethod1() {
  34. method1();
  35. }
  36. public void callMethod2() {
  37. method2();
  38. }
  39. }
  40. }

MainActivity类

  1. public class MainActivity extends Activity {
  2. private MyBinder myBinder;
  3. @Override
  4. protected void onCreate(Bundle savedInstanceState) {
  5. super.onCreate(savedInstanceState);
  6. setContentView(R.layout.activity_main);
  7. conn = new MyServiceConnection();
  8. }
  9. ServiceConnection conn;
  10. public void start(View v) {
  11. Intent service = new Intent(this, MyService.class);
  12. startService(service);
  13. }
  14. public void bind(View v) {
  15. Intent service = new Intent(this, MyService.class);
  16. bindService(service, conn, Context.BIND_AUTO_CREATE);
  17. }
  18. public void unbind(View v) {
  19. unbindService(conn);
  20. }
  21. public void stop(View v) {
  22. Intent service = new Intent(this, MyService.class);
  23. stopService(service);
  24. }
  25. public void callmethod1(View v) {
  26. myBinder.callMethod1();
  27. }
  28. private class MyServiceConnection implements ServiceConnection {
  29. @Override
  30. public void onServiceConnected(ComponentName name, IBinder service) {
  31. System.out.println("MyServiceConnection connection success");
  32. myBinder = (MyBinder) service;
  33. }
  34. @Override
  35. public void onServiceDisconnected(ComponentName name) {
  36. System.out.println("MyServiceConnection disconnection success");
  37. }
  38. }
  39. }

activity_main.xml页面布局

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:orientation="vertical"
  6. tools:context=".MainActivity" >
  7. <Button
  8. android:layout_width="match_parent"
  9. android:layout_height="wrap_content"
  10. android:onClick="start"
  11. android:text="startService" />
  12. <Button
  13. android:layout_width="match_parent"
  14. android:layout_height="wrap_content"
  15. android:onClick="bind"
  16. android:text="bindService" />
  17. <Button
  18. android:layout_width="match_parent"
  19. android:layout_height="wrap_content"
  20. android:onClick="unbind"
  21. android:text="unbindService" />
  22. <Button
  23. android:layout_width="match_parent"
  24. android:layout_height="wrap_content"
  25. android:onClick="stop"
  26. android:text="stopService" />
  27. <Button
  28. android:layout_width="match_parent"
  29. android:layout_height="wrap_content"
  30. android:onClick="callmethod1"
  31. android:text="call Method1" />
  32. </LinearLayout>

第一种

调用startService(),再调用stopService()。这样的情况适用于直接使用Service。不须要外部调用服务内部的方法。

在这一种中,我们分别会点击startService和stopService。在类MyService中,会以onCreate()開始 — 代表第一次创建服务;以onDestory()结束 — 代表服务被销毁。中间会一次或者多次调用(当重复startService时)onStartCommand()方法 — 来表示客户端想明白的启动服务。

当点击startService时,会触发onCreate()onStartCommand()方法。表示服务是第一次创建而且是客户端明白要求的。

这两个方法运行完成后。后台的服务线程启动。

看一下这张图:



这个过程相应的Log图和应用后台服务进程图例如以下:

能够清楚的看到。调用了onCreate()onStartCommand()方法,同一时候后台的服务进程也已经启动。

当点击stopService时,会触发onDesctory(),此时会去销毁后台服务进程。

看一下这张图:



这个过程相应的Log图和应用后台服务进程图例如以下:

能够清楚的看到,调用onDesctory()方法。同一时候后台服务线程也被销毁了。

另外一种

单独调用bindService()方法将Activity和Service绑定,以达到服务内部方法的目的。再调用unbindService()解绑。

在这一种中,我们分别会点击bindService和unbindService,在类MyService中,会以onCreate()開始 — 代表第一次创建服务;以onDestory()结束 — 代表服务被销毁;在中间。当绑定成功时,会调用onServiceConnected()表明Activity和Service连接成功;当解除绑定时,会调用onUnbind()表明Activity和Service解除连接成功。

当点击bindService时,会触发onCreate()onServiceConnected()方法。以达到调用服务内部方法的目的。可是。请注意后台服务进程并没有启动

看一下这张图:



这个过程相应的Log图和应用后台服务进程图例如以下:

能够清楚的看到,调用了onCreate()onServiceConnected()方法,可是。后台的服务进程却没有启动

绑定后就能够调用服务内部的方法了。而MyService is method1就是证明。

当点击unbindService时,会触发onUnbind()onDestory()方法表明解除绑定和销毁服务。

看一下这张图:



这个过程相应的Log图和应用后台服务进程图例如以下:

能够清楚的看到,调用onUnbind()onDesctory()方法,后台也没有服务线程。可是,尽管解除了绑定,我们却依然能够调用服务中的方法。

第三种

先调用startService()。再调用bindService()方法,再调用unbindService(),最后调用stopService(),这样的情况适用于希望服务能够在后台长期运行。仅仅要不stopService就不停止,也能够让Activity调用服务中的方法。

当着四种组合使用时。请依照下图的方式点击调用:

我们能够看到,运行方法的顺序是一级一级的。当上一级没有触发时,是无法进入到下一级的。

当点击完startService和bindService时,Log和后台进程图例如以下所看到的:



能够看到。后台进程启动,而且Activity和Service绑定成功。且能够调用后台的方法。

当点击完unbindService时,会运行onUnbind()方法解除绑定,Log和后台进程图例如以下:



能够看到,尽管解除绑定了,可是服务没有销毁,服务中的内容依然能够被调用。

当点击完stopService时,服务被销毁onDestory()方法被运行,Log和后台进程图例如以下:



能够看到,后台的服务已经被销毁了,可是。重点中的重点,服务中的方法依然能够被调用。

总结

开启服务有三种情况:假设直接使用服务,则没有必要进行绑定,可是假设要使用服务里面的方法,则要进行绑定。

另外,仅仅要使用了bindService,无论之后是否解绑和停止服务,都能够调用服务中的方法

版权声明:本文博主原创文章,博客,未经同意不得转载。

Android基调(十六)- Service:startService()、stopService()、bindService()、unbindService()加的更多相关文章

  1. Android进阶(十六)子线程调用Toast报Can't create handler inside thread that has not called Looper.prepare() 错误

    原子线程调用Toast报Can't create handler inside thread that has not called Looper.prepare() 错误 今天用子线程调Toast报 ...

  2. Android入门(十六)调用摄像头相册

    原文链接:http://www.orlion.ga/665/ 一.调用摄像头 创建一个项目ChoosePicDemo,修改activity_main.xml: <LinearLayout xml ...

  3. Android之旅七 Service简介

    1.          Service是什么:它是一个应用程序组件.没有图形化界面.通常用来处理一些耗时比较长的操作(例如下载.播放MP3等等).可以使用Service更新ContentProvide ...

  4. [Android Pro] Service (startservice , bindservice , unbindservice, stopService)

    1: startService -------stopService (this will call onDestroy) 2: bindService -------unbindService    ...

  5. 深入理解Android的startservice和bindservice

    一.首先,让我们确认下什么是service?         service就是android系统中的服务,它有这么几个特点:它无法与用户直接进行交互.它必须由用户或者其他程序显式的启动.它的优先级比 ...

  6. 理解Android的startservice和bindservice(转)

    一.首先,让我们确认下什么是service? service就是android系统中的服务,它有这么几个特点:它无法与用户直接进行交互.它必须由用户或者其他程序显式的启动.它的优先级比较高,它比处于前 ...

  7. 初学Android,创建,启动,停止Service(五十八)

    Service跟Windows系统里的服务概念差不多,都在后台执行,它跟Activity的最大区别就是,它是无界面的 开发Service与开发Activity的步骤类似 1.定义一个继承Service ...

  8. Android多媒体学习六:利用Service实现背景音乐的播放

    Android同意我们使用Service组件来完毕后台任务.这些任务的同意不会影响到用户其它的交互. 1.Activity类 [java] view plaincopy package demo.ca ...

  9. Android实现简单音乐播放器(startService和bindService后台运行程序)

    Android实现简单音乐播放器(MediaPlayer) 开发工具:Andorid Studio 1.3运行环境:Android 4.4 KitKat 工程内容 实现一个简单的音乐播放器,要求功能有 ...

随机推荐

  1. ORACLE 计算节假日

    create or replace function get_workday(starTime in date,endTime in date) return number is Weekends n ...

  2. UITextView 限制输入字数

    尊重原创  http://blog.csdn.net/fengsh998/article/details/45421107 对于限制UITextView输入的字符数.相信大家在网上见得最多的是实现UI ...

  3. GDI+ 对象释放崩溃的问题

    确保在Gdiplus::GdiplusShutdown(m_gdiplusToken); 之前delete 掉GDI+的对象,例如:delete *pBitmap; 如果先Gdiplus::Gdipl ...

  4. C/C++指针和数组的关系

    首先一个列子说明指针和数组真的不是一回事: 浅谈C中的指针和数组(一) 如果用硬是把数组和指针放在一个,一个放声明里一个放定义中,这里就能看到指针和数组名是不同的.这篇文章从符号表的角度分析一下指针和 ...

  5. 经典union的使用

    一个用户下广告位  某一天有收入和支出  有支出不一定有收入  有收入不一定有支出  下例为按用户查询 sanhao 下的信息 支出如下: 收入如下: 按天进行查询,例如查询: 得到结果如下: 使用一 ...

  6. Oracle的大数据类型,BIG DATA TYPE

    1.CLOB 字符LOB类型,主要用于存储大型英文字符 2.NCLOB 国际语言字符LOB类型,主要用于存储大型非英文字符 3.BLOB 二进制LOB类型,主要用于存储二进制数据 4.BFILE 二进 ...

  7. wireshark 包分析命令

    1.查看原地址过滤包命令: ip.src ==192.168.1.1 2.查看目的地址过滤包:ip.dst == 192.168.1.1 3.关键字 eq 等于 "==" ,and ...

  8. Protel 99SE PCB 打印技巧

    1. 打开 Protel99SE PCB 设计文档.从菜单File 下单击Print/Preview 打印预览菜单.出现PCB 打印预览介面. 2.从File 下单击 Setup Printer 设置 ...

  9. 试用阿里云RDS的MySQL压缩存储引擎TokuDB

    以前就用过自己搭建MySQL服务器的两种存储引擎MyISAM和InnoDB(也用过一点Memory方式),在今年初转向阿里云关系型数据库服务RDS的时候,看到可调参数中有一个TokuDB,不过不太了解 ...

  10. Ntop监控网络流量

    运用Ntop监控网络流量 ____ 网络流量反映了网络的运行状态,是判别网络运行是否正常的关键数据,在实际的网络中,如果对网络流量控制得不好或发生网络拥塞,将会导致网络吞吐量下降. 网络性能降低.通过 ...