Service的两种启动方式:startService()与bindService()
 
statService:生命周期:【onCreate()-  >onStartCommand()->startService()->onDestroy()】,与调用者无关可后台运行
 
bindService:生命周期:【onCreate()->onBind()->onUnbind()->onDestroy()】,依存于调用的activity
 
 
1.statService启动方式使用(启动的Activity finish后service仍在执行,需stopService()才会停止);
 
(1)在androidmanifast文件中增加service组件,与activity同一层次下
 
(2)编写一个类继承Service类,重写onCreate(),onDestroy(),onStartCommand()方法
 
(3)activity中调用startService(Intent service);启动服务
                          stopService(Intent service);停止服务
 
适用于在应用程序被关闭后仍然需要执行的操作;
 
 
2.bindService Binder式service(绑定的activity finish后service即刻停止):
 
bindService使用步骤:
Intent service =new Intent(this,ServiceClass.class);
bindService(Intent service,ServiceConnection conn, int flags);
(1)ServiceConnection对象:用于在activity与service之间建立连接,服务启动后可通过其回调方法使用service中的服务。
ServiceConnection conn=new ServiceConnection(){
//service与Activity建立连接后调用的两个方法,用于使用service中的服务
@Override
public void onServiceDisconnected(ComponentName arg0) {
// TODO Auto-generated method stub
} @Override
public void onServiceConnected(ComponentName arg0, IBinder arg1) { //arg1为OnBind()方法中返回的Binder对象, 可通过该对象获得service对象本身(在Binder类中有一个getService()方法用于返回service对象本身)
MyBinder binder=(MyBinder)arg1; //调用getService()方法获得service对象本身
BindService bindservice=binder.getService(); //接下来便可调用service中的方法来实现一定功能
String result=bindservice.service();
}
};
(2)继承Service,重写onCreate(),onBind(),onUnbind(),onDestroy()。
        onCreate():在服务第一次创建的时候调用
        onBind():在服务在每次启动时调用
        onUnBind():在服务停止时调用
        onDestory():在服务销毁时调用
 
service与activity是通过一个Binder(Binder为IBinder子类)子类对象建立联系的,所以要想使用Service子类中的服务操作需要在子类的onBind()方法中返回一个Binder的子类对象,通过该Binder子类对象中的getService()方法来获取Service子类对象本身,这样就可以使用Service子类对象中的各种服务方法了。
 
class BindService extends Service {

        // 实现onBind()方法返回一个Binder对象
public IBinder onBind(Intent arg0){ return mybinder; } //内部类Mybinder
class MyBinder extends Binder{ public BindService getService(){ return BindeService.this;
}
} //BindService中的方法,将使用binder.getService().service()调用
public String service(){
// 方法实现
}
}

3、IntentService

由于Service中的代码都是运行在主线程中的,如果在Service中处理一些耗时操作,会容易出现ANR的情况。此时需要在Service中开启一个子线程来处理耗时操作。但是会出现忘记开启线程或线程中操作执行完成后忘记停止服务的情况。

所以Android系统提供了一种更为简便的处理Service中ANR情况的方式——使用IntentService。

IntentService有以下特点:

(1)  它创建了一个独立的工作线程来处理所有的通过onStartCommand()传递给服务的intents。

(2)  创建了一个工作队列,来逐个发送intent给onHandleIntent()。

(3)  不需要主动调用stopSelft()来结束服务。因为,在所有的intent被处理完后,系统会自动关闭服务。

(4)  默认实现的onBind()返回null

(5)  默认实现的onStartCommand()的目的是将intent插入到工作队列中

继承IntentService的类至少要实现两个函数:构造函数和onHandleIntent(Intent intent)函数。要覆盖IntentService的其它函数时,注意要通过super调用父类的对应的函数。

onHandleIntent(Intent intent)中的Intent参数是startService(Intent intent)/bindService(Intent intent)中传进的intent对象,该intent对象可以携带一些参数

在onHandleIntent(Intent intent)方法中可以通过intent携带的参数来区分不同的intent(即如果多次启动同一个service要执行不同操作时可在intent对象中传入不同的参数来区别),接下来便可以执行不同的操作。

        //Operation 1
Intent startServiceIntent = new Intent("com.test.intentservice");
Bundle bundle = new Bundle();
bundle.putString("param", "oper1");
startServiceIntent.putExtras(bundle);
startService(startServiceIntent); //Operation 2
Intent startServiceIntent2 = new Intent("com.test.intentservice");
Bundle bundle2 = new Bundle();
bundle2.putString("param", "oper2");
startServiceIntent2.putExtras(bundle2);
startService(startServiceIntent2);
 
public class IntentServiceDemo extends IntentService {  

    public IntentServiceDemo() {
//必须实现父类的构造方法
super("IntentServiceDemo");
} @Override
public IBinder onBind(Intent intent) {
System.out.println("onBind");
return super.onBind(intent);
} @Override
public void onCreate() {
System.out.println("onCreate");
super.onCreate();
} @Override
public void onStart(Intent intent, int startId) {
System.out.println("onStart");
super.onStart(intent, startId);
} @Override
public int onStartCommand(Intent intent, int flags, int startId) {
System.out.println("onStartCommand");
return super.onStartCommand(intent, flags, startId);
} @Override
protected void onHandleIntent(Intent intent) {
//Intent是从Activity发过来的,携带识别参数,根据参数不同执行不同的任务
String action = intent.getExtras().getString("param");
if (action.equals("oper1")) {
System.out.println("Operation1");
}else if (action.equals("oper2")) {
System.out.println("Operation2");
} try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
} @Override
public void onDestroy() {
System.out.println("onDestroy");
super.onDestroy();
} }

 

android基础(四)service的更多相关文章

  1. Android基础(五) Service全解析----看不见的Activity

    一.服务的介绍: 作为Android四大组件之中的一个,Service(服务)也常常运用于我们的日常使用中,它与Activity的差别在于:Service一直在后台执行.没实用户界面.所以绝不会到前台 ...

  2. <Android基础>(四) Fragment Part 1

    Fragment 1)Fragment的简单用法 2)动态添加Fragment 3)在Fragment中模拟返回栈 4)Fragment和活动之间通信 第四章 Fragment Fragment是一种 ...

  3. <Android基础> (四) Fragment Part 2

    4.3 Fragment的生命周期 4.3.1 Fragment的状态和回调 1.运行状态 当一个Fragment是可见的,并且它关联的活动正处于运行状态是,该Fragment也处于运行状态 2.暂停 ...

  4. 安卓Android基础四天

    网页源码查看器 HttpURLConnection:用于发送和接受数据 ScrollView只能由一个孩子 消息机制的写法(***) anr Application not response 应用无响 ...

  5. android基础---->service的生命周期

    服务是一个应用程序组件代表应用程序执行一个长时间操作的行为,虽然不与用户交互或供应功能供其它应用程序使用.它和其他的应用对象一样,在他的宿主进程的主线程中运行.今天我们开始android中普通serv ...

  6. Android基础测试题(四)

    看了前两道题大家有没有发现,测试题少了(一),大家猜猜测试题(一)是什么? Android基础测试题(四): 需求: 建一个方法,格式化输出2016-11-14 10:15:26格式的当前时间,然后截 ...

  7. 实验四实验报告————Android基础开发

    实验四实验报告----Android基础开发 任务一 关于R类 关于apk文件 实验成果 任务二 活动声明周期 实验成果 任务三 关于PendingIntent类 实验成果 任务四 关于布局 实验成果 ...

  8. Android基础夯实--重温动画(四)之属性动画 ValueAnimator详解

    宝剑锋从磨砺出,梅花香自苦寒来:千淘万漉虽辛苦,吹尽狂沙始到金: 长风破浪会有时,直挂云帆济沧海 一.摘要 Animator类作为属性动画的基类,它是一个抽象类,它提供了实现动画的基本架构,但是我们不 ...

  9. 基础4 Android基础

    基础4 Android基础 1. Activity与Fragment的生命周期. Activity生命周期 打开应用 onCreate()->onStart()->onResume 按BA ...

  10. Android基础总结(8)——服务

    服务(Service)是Android中实现程序后台运行的解决方案,它非常适合用于去执行哪些不需要和用户交互而且还要长期运行的任务.服务的运行不依赖任何用户界面,即使当程序被切换到后台,或者用户打开了 ...

随机推荐

  1. Unix/Linux编程实践教程(0:文件、终端、信号)

    本来只打算读这本书socket等相关内容,但书写得实在好,还是决定把其余的内容都读一下. 阅读联机帮助的一个示例: open系统调用: read系统调用: Unix的time: 上面的printf可以 ...

  2. Ajax实现原理详解

    Ajax:Asynchronous javascript and xml,实现了客户端与服务器进行数据交流过程.使用技术的好处是:不用页面刷新,并且在等待页面传输数据的同时可以进行其他操作. 这就是异 ...

  3. R----plotly包介绍学习

    plotly包:让ggplot2的静态图片变得可交互 Plotly 是个交互式可视化的第三方库,官网提供了Python,R,Matlab,JavaScript,Excel的接口,因此我们可以很方便地在 ...

  4. VS2012解决方案的设置

    用VS开发项目时,一个解决方案可以包含多个项目,在此我记录一下: 1.首先我新建一个Win32Demo的解决方案: 2.勾选"空项目": 3.新建完之后,会默认生成一个Win32D ...

  5. Git 忽略文件

    在Git中如果想忽略掉某个文件,不让这个文件提交到版本库中,可以使用修改 .gitignore 文件的方法.这个文件每一行保存了一个匹配的规则例如: # 此为注释 – 将被 Git 忽略 *.a    ...

  6. consul笔记

    1 webui 默认最新的webui只支持127.0.0.1这种的本机网站的 不支持192.168.1.2 启用192.168.1.2的支持 命令加 -client 192.168.2.156 感谢赵 ...

  7. FreeMarker常用语法

    转自:http://www.cnblogs.com/linjiqin/p/3388298.html FreeMarker的插值有如下两种类型:1,通用插值${expr};2,数字格式化插值:#{exp ...

  8. 【hdu4366】dfs序线段树

    #include <bits/stdc++.h> #define ll long long #define lson l, m, rt<<1 #define rson m+1, ...

  9. PyCharm配置GitHub

    原文出处: https://github.com/wssnail/ws96apt/blob/master/weixin/a.py#L21-21打开file,选择settings,找到Version C ...

  10. C++学习笔记一 —— 两个类文件互相引用的处理情况

    先记录一些零碎的知识点: 1. 一个类可以被声明多次,但只能定义一次,也就是可以 class B;  class B;  class B; ……;  class B {……};  这样子. 2. 一个 ...