服务的基本用法


定义服务: 我们需要先创建服务,我们要使用就的利用一个类去继承它,然后重写它的几个方法,具体的我们看下面的代码:

我们重写了下面三个方法:

* onCreate()                 服务创建的时候调用

* onStartCommand()     每次服务启动的时候调用

* onDestory()                服务销毁的时候调用

注意点: 首先要明白我们的onCreate()方法,我们说了它只会在服务被创建的时候调用,之后你开启服务的时候是不会再调用这个onCreate()方法了,没启动一次只会走 onStartCommand()方法,onDestory()是在服务被销毁的时候调用,下面我们再看看它的启动。

Intent startIntent = new Intent(this,MyService.class);

// 启动服务
startService(startIntent);
// 停止服务
stopService(startIntent);

活动和服务之间的通信


首先我们的完善我们的服务类,在我们的服务类中添加  Binder 类,这个类会对我们想要在服务类中做的事做一个管理:

class MyService extends Service{

    public MyService() {
} private DownloadBinder downloadBinder = new DownloadBinder();
class DownloadBinder extends Binder{ public void startDownload(){ Log.d("DownloadBinder","startDownload");
} public int getProgress(){ Log.d("DownloadBinder","getProgress");
return 0;
}
} @Nullable
@Override
public IBinder onBind(Intent intent) {
return downloadBinder;
} @Override
public void onCreate() {
super.onCreate();
} @Override
public int onStartCommand(Intent intent, int flags, int startId) {
return super.onStartCommand(intent, flags, startId);
} @Override
public void onDestroy() {
super.onDestroy();
}
}

接着我们看在活动里面是怎样和这个服务类进行一个绑定的,具体的需要注意的地方我们都加了注释,就不在这里在重复,注意看注释就可以:

 /*
*
* 首先我们创建一个ServiceConnection匿名类,在里面重写了onServiceConnected和onServiceDisconnected方法
* 这两个方法分别在活动和服务成功绑定的时候和解绑的时候调用
*
* */
private MyService.DownloadBinder downloadBinder;
private ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
// 绑定成之后我们就可以随意的使用调用服务中的方法了
downloadBinder = (MyService.DownloadBinder) iBinder;
downloadBinder.startDownload();
downloadBinder.getProgress();
} @Override
public void onServiceDisconnected(ComponentName componentName) { }
}; // 绑定和解绑按钮事件来绑定和解绑
@Override
public void onClick(View view) { switch (view.getId()){
// 活动绑定服务
case R.id.bind_service: // 绑定的时候使用bindService方法,参数分别是 Intent 和 connection
Intent bindIntent = new Intent(this,MyService.class);
bindService(bindIntent,connection,BIND_AUTO_CREATE);
break; // 活动解绑服务
case R.id.unbind_service: unbindService(connection);
break; default:
break;
} }

服务的生命周期


我们通过下面的两张图说一下服务的生命周期:

Service生命周期流程图:

我们在通过下面的一个调用顺序来解读一下这生命周期:

 服务使用的两个小技巧


      1、使用前台服务
 
          服务几乎都是在后台运行的,但由于服务的优先级比较低,当系统出现内存不足的情况的时候就有可能回收掉正在后台运行的服务,如果我们想服务一直保持运行状态,而不会由于系统内存不足原因导致服务被回收掉,就可以考虑使用前台服务,前台服务和普通服务最大的区别就在于他会一直有一个正在运行的图标在系统的状态栏显示。
 
          我们通过下面的代码展示如何创建一个前台服务:
 
 
 
      2、使用IntentService
 
           话说回来,在前面我们就有说过,服务中的代码是默认运行在主线程中的,如果直接在服务中处理洗衣额好事的逻辑,就很容易出现ANR (Application Not Responding),所以这个时候我们就需要使用安卓的多线程技术,我们应该在服务中的每个具体的方法里开启一个子线程,然后去处理一些耗时的操作。
 
           按照我们的逻辑,我们就需要开启多线程,执行耗时操作,然后在操作完成之后关闭服务,代码如下:

可我们还有更简单的方法来做这件事,利用我们要说的 IntentService

  

       通过上面这两篇文章,关于Android服务大概就介绍完了。

Android学习--探究服务(二)的更多相关文章

  1. Android学习--探究服务(一)

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

  2. 【转】Pro Android学习笔记(二):开发环境:基础概念、连接真实设备、生命周期

    在Android学习笔记(二):安装环境中已经有相应的内容.看看何为新.这是在source网站上的Android架构图,和标准图没有区别,只是这张图颜色好看多了,录之.本笔记主要讲述Android开发 ...

  3. Android学习路线(二十四)ActionBar Fragment运用最佳实践

    转载请注明出处:http://blog.csdn.net/sweetvvck/article/details/38645297 通过前面的几篇博客.大家看到了Google是怎样解释action bar ...

  4. 【转】 Pro Android学习笔记(二二):用户界面和控制(10):自定义Adapter

    目录(?)[-] 设计Adapter的布局 代码部分 Activity的代码 MyAdapter的代码数据源和构造函数 MyAdapter的代码实现自定义的adapter MyAdapter的代码继续 ...

  5. 【转】 Pro Android学习笔记(二十):用户界面和控制(8):GridView和Spinner

    目录(?)[-] GridView Spinner GridView GridView是网格状布局,如图所示.在了解ListView后,很容易了解GridView.下面是例子的XML文件. <? ...

  6. Android学习路线(二十一)运用Fragment构建动态UI——创建一个Fragment

    你能够把fragment看成是activity的模块化部分.它拥有自己的生命周期,接受它自己的输入事件,你能够在activity执行时加入或者删除它(有点像是一个"子activity&quo ...

  7. 【转】 Pro Android学习笔记(二九):用户界面和控制(17):include和merge

    目录(?)[-] xml控件代码重用include xml控件代码重用merge 横屏和竖屏landsacpe portrait xml控件代码重用:include 如果我们定义一个控件,需要在不同的 ...

  8. 【转】Pro Android学习笔记(二五):用户界面和控制(13):LinearLayout和TableLayout

    目录(?)[-] 布局Layout 线性布局LinearLayout 表格布局TableLayout 布局Layout Layout是容器,用于对所包含的view进行布局.layout是view的子类 ...

  9. Android学习笔记(二)——探究一个活动

    //此系列博文是<第一行Android代码>的学习笔记,如有错漏,欢迎指正! 活动(Activity)是最容易吸引到用户的地方了,它是一种可以包含用户界面的组件,主要用于和用户进行交互.一 ...

随机推荐

  1. Java-Eclipse-Jabref一条龙

    Java部分: 1. 到Oracle官网下载需要版本的JDK:http://www.oracle.com/technetwork/java/javase/archive-139210.html 2. ...

  2. warning LNK4070的解决办法

           原文链接地址:http://blog.csdn.net/clever101/article/details/5898073#comments         重命名了一个MFC常规DLL ...

  3. 网络编程:listen函数

    listen函数仅由TCP服务器调用,它做两件事: 当socket函数创建一个套接字时,它被假设为一个主动套接字,也就是说,它是一个将调用connect发起连接的客户套接字.listen函数把一个未连 ...

  4. BZOJ2286 [Sdoi2011]消耗战 【虚树 + 树形Dp】

    2286: [Sdoi2011]消耗战 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 4261  Solved: 1552 [Submit][Sta ...

  5. MySQL:BlackHole

    MySQL:BlackHole 顾名思义BlackHole就是黑洞,只有写入没有输出.现在就来实验一下吧 首先查看一下MySQL支持的存储引擎 mysql> show engines;+---- ...

  6. D. Equalize the Remainders (set的基本操作)

    D. Equalize the Remainders time limit per test 3 seconds memory limit per test 256 megabytes input s ...

  7. django自己搭建的博客

    1.博客地址: http://jiangtao4.pythonanywhere.com/ 2.后台可以发布笔记,可以翻页,数据存在MySQL里面 3.GitHub地址: https://github. ...

  8. Install the Active Directory Administration Tools on Windows Server

    安装 Active Directory 管理工具 To manage your directory from an EC2 Windows instance, you need to install ...

  9. 02-导航实例-storyboard实现

        源代码下载链接:02-导航实例-storyboard实现.zip38.5 KB // MJAboutViewController.h // //  MJAboutViewController. ...

  10. bzoj 1880 最短路

    我们首先知道,答案肯定是最短路图中的某段公共链,那么设(x,y)为x到y的最短路,那么答案为((s1,t1)+(s2,t2)-min((s1,s2)+(t1,t2),(s1,t2),(s2,t1))) ...