Android基调(十六)- Service:startService()、stopService()、bindService()、unbindService()加
开门见山
开启服务有三种情况:假设直接使用服务,则没有必要进行绑定,可是假设要使用服务里面的方法。则要进行绑定。
- 具体的启动情况有下:
- ①调用
startService()
。再调用stopService()
。 - ②单独调用
bindService()
方法,再unbindService()
后,以运行服务内部的方法。 - ③先调用
startService()
,再调用bindService()
方法,再调用unbindService()
。最后调用stopService()
。 - 特殊情况:
- 仅仅要使用了bindService,无论之后是否解绑和停止服务,都能够调用服务中的方法
以下针对这三种启动顺序分别做具体说明。
在解说之前先贴一下代码:
MyService类。里面就不加凝视了
public class MyService extends Service {
@Override
public IBinder onBind(Intent intent) {
return new MyBinder();
}
@Override
public void onCreate() {
System.out.println("MyService onCreate():Called by the system when the service is first created");
super.onCreate();
}
@Override
public boolean onUnbind(Intent intent) {
System.out.println("MyService onUnbind():Called when all clients have disconnected from a particular interface published by the service.");
return super.onUnbind(intent);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
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.");
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
System.out.println("MyService onDestroy():Called by the system to notify a Service that it is no longer used and is being removed. ");
super.onDestroy();
}
public void method1() {
System.out.println("MyService is method1");
}
public void method2() {
System.out.println("MyService is method2");
}
class MyBinder extends Binder {
public void callMethod1() {
method1();
}
public void callMethod2() {
method2();
}
}
}
MainActivity类
public class MainActivity extends Activity {
private MyBinder myBinder;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
conn = new MyServiceConnection();
}
ServiceConnection conn;
public void start(View v) {
Intent service = new Intent(this, MyService.class);
startService(service);
}
public void bind(View v) {
Intent service = new Intent(this, MyService.class);
bindService(service, conn, Context.BIND_AUTO_CREATE);
}
public void unbind(View v) {
unbindService(conn);
}
public void stop(View v) {
Intent service = new Intent(this, MyService.class);
stopService(service);
}
public void callmethod1(View v) {
myBinder.callMethod1();
}
private class MyServiceConnection implements ServiceConnection {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
System.out.println("MyServiceConnection connection success");
myBinder = (MyBinder) service;
}
@Override
public void onServiceDisconnected(ComponentName name) {
System.out.println("MyServiceConnection disconnection success");
}
}
}
activity_main.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"
tools:context=".MainActivity" >
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="start"
android:text="startService" />
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="bind"
android:text="bindService" />
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="unbind"
android:text="unbindService" />
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="stop"
android:text="stopService" />
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="callmethod1"
android:text="call Method1" />
</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()加的更多相关文章
- 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报 ...
- Android入门(十六)调用摄像头相册
原文链接:http://www.orlion.ga/665/ 一.调用摄像头 创建一个项目ChoosePicDemo,修改activity_main.xml: <LinearLayout xml ...
- Android之旅七 Service简介
1. Service是什么:它是一个应用程序组件.没有图形化界面.通常用来处理一些耗时比较长的操作(例如下载.播放MP3等等).可以使用Service更新ContentProvide ...
- [Android Pro] Service (startservice , bindservice , unbindservice, stopService)
1: startService -------stopService (this will call onDestroy) 2: bindService -------unbindService ...
- 深入理解Android的startservice和bindservice
一.首先,让我们确认下什么是service? service就是android系统中的服务,它有这么几个特点:它无法与用户直接进行交互.它必须由用户或者其他程序显式的启动.它的优先级比 ...
- 理解Android的startservice和bindservice(转)
一.首先,让我们确认下什么是service? service就是android系统中的服务,它有这么几个特点:它无法与用户直接进行交互.它必须由用户或者其他程序显式的启动.它的优先级比较高,它比处于前 ...
- 初学Android,创建,启动,停止Service(五十八)
Service跟Windows系统里的服务概念差不多,都在后台执行,它跟Activity的最大区别就是,它是无界面的 开发Service与开发Activity的步骤类似 1.定义一个继承Service ...
- Android多媒体学习六:利用Service实现背景音乐的播放
Android同意我们使用Service组件来完毕后台任务.这些任务的同意不会影响到用户其它的交互. 1.Activity类 [java] view plaincopy package demo.ca ...
- Android实现简单音乐播放器(startService和bindService后台运行程序)
Android实现简单音乐播放器(MediaPlayer) 开发工具:Andorid Studio 1.3运行环境:Android 4.4 KitKat 工程内容 实现一个简单的音乐播放器,要求功能有 ...
随机推荐
- SQL Server使用LIKE运算符进行匹配查询
在查询的过程中,如果遇到不能明确的指明查询的限定条件时,就会用到LIKE运算符进行模式匹配查询.在查询时可以使用如下几个通配符: %:包含零个或多个字符的任意字符串 —(下划线):任何单个字符 []: ...
- Migration data on SQL
从表里面导出数据XML: -- export declare @xml xml set @xml = (select * from ( select TableName = 'Schema', xml ...
- Objective-c (多输入参数的方法)
一个方法可能具有多个输入参数.在头文件中,可以定义带有多个输入参数的方法: - (void)setIntX:(int)n andSetIntY:(int)d 下面通过一个例子来说明它的具体用法: #i ...
- Spring 中拦截器与过滤器的区别
spring 中拦截器 与servlet 的filter 有相似之处.比如二者都是aop 编程思想的体现都能实现权限检查,日志记录等. 不同之处 使用范围不同 Filter 是Servlet 规定的. ...
- org.apache.tomcat.util.bcel.classfile.ClassFormatException: null is not a Java .class file
org.apache.tomcat.util.bcel.classfile.ClassFormatException: null is not a Java .class file 在$TOMCA ...
- UVa10082 WERTYU
#include <stdio.h>#include <string.h> int main(){ // 用C++提交AC char s[] = "`12345 ...
- HDU3496-Watch The Movie
描述: New semester is coming, and DuoDuo has to go to school tomorrow. She decides to have fun tonight ...
- ThinkPHP第十六天(redirect、join、视图模型)
1.redirect /** * Action跳转(URL重定向) 支持指定模块和延时跳转 * access protected * @param string $url 跳转的URL表达式 * @p ...
- 01-C语言基本知识
目录: 一.C语言基本知识 二.C语言概述 回到顶部 一.C语言基本知识 1 语言背景 1946年,美国冯·诺依曼第一台计算机. 四大部分:中央处理器(控制器,运算器),存储器,输入设备,输出设备. ...
- android 构建数据库SQLite
1.首先我们需要一个空白的eclipse android工程 2.然后修改AndroidManifest.xml 在<application></application>标签里 ...