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. Java虚拟机学习(1):体系结构 内存模型

    一:Java技术体系模块图 Java技术体系模块图 二:JVM内存区域模型 1.方法区 也称"永久代" ."非堆",  它用于存储虚拟机加载的类信息.常量.静态 ...

  2. Flowplayer-Subtitle

    SOURCE URL: https://flowplayer.org/docs/subtitles.html Setting up Subtitles are loaded with a <tr ...

  3. InputStream,BufferedImage与byte数组之间的转换

    需要获取网络的一张图片,但是某种需要,要把获取的这段流输入换为BufferedImage流,有的地方还需要转换为byte[]. 获得图片地址,获得了一个图片输入流,例如:    Url img = n ...

  4. oracle组查询

    概念: 所谓组查询即将数据按照某列或者某些列相同的值进行分组,然后对该组的数据进行组函数运用,针对每一组返回一个结果. note: 1.组函数可以出现的位置: select子句和having 子句 2 ...

  5. 学习c++

    慢慢的滑向无边无际的没有回头路的程序猿道路.坚持就是胜利. 致渣渣

  6. 关于JS的数据类型的一些见解

    关于js里的数据类型这块,说下个人对它的一些见地 js中的数据类型可以归类两类, 简单数据类型:string,number,boolean,null,undefined 复杂数据类型:object 其 ...

  7. python成长之路【第六篇】:python模块--time和datetime

    1.时间表现形式 时间戳  (1970年1月1日之后的秒,即:time.time())格式化的时间字符串   (2014-11-11 11:11,    即:time.strftime('%Y-%m- ...

  8. os.environ()

    ---------2016-5-9 18:56:39-- source:OS.ENVIRON()详解

  9. mac 安装 Scrapy

    一.pip安装Scrapy 运行命令 sudo pip install Scrapy(不带sudo 可能会出现 Permission denied) 然后 pip freeze 查看已经有 scrap ...

  10. linux进程编程:子进程创建及执行函数简介

    linux进程编程:子进程创建及执行函数简介 子进程创建及执行函数有三个: (1)fork();(2)exec();(3)system();    下面分别做详细介绍.(1)fork()    函数定 ...