服务的基本用法


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

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

* 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. 【题解】HAOI2007分割矩阵

    水题盛宴啦啦啦……做起来真的极其舒服,比某些毒瘤题好太多了…… 数据范围极小 --> 状压 / 搜索 / 高维度dp:观察要求的均方差,开始考虑是不是能够换一下式子.我们用\(a_{x}\)来表 ...

  2. [Leetcode] Palindrome number 判断回文数

    Determine whether an integer is a palindrome. Do this without extra space. click to show spoilers. S ...

  3. BZOJ2729 [HNOI2012]排队 【高精 + 组合数学】

    题目链接 BZOJ2729 题解 高考数学题... 我们先把老师看做男生,女生插空站 如果两个老师相邻,我们把他们看做一个男生,女生插空站 对于\(n\)个男生\(m\)个女生的方案数: \[n!m! ...

  4. [MySQL] explain执行计划解读

    Explain语法 EXPLAIN SELECT …… 变体: 1. EXPLAIN EXTENDED SELECT …… 将执行计划“反编译”成SELECT语句,运行SHOW WARNINGS 可得 ...

  5. region xx not deployed on any region server

    ERROR: Region { meta => month_hotstatic,860010-2288000000_201405_5_exit_00000047486,1400144486405 ...

  6. Nginx support TCP Load balance

    1. Install nginx package 2. edit nginx configuration file [root@ip- nginx]# more nginx.conf user ngi ...

  7. Spring 中 AbstractExcelView 支持根据模板生成Excel文件. 通过设置 view 的 URL 属性指定模板的路径

     注意:1. 模板需放在 WEB-INF 目录下2. 指定模板路径时不需要添加扩展名, Spring将自动添加 .xls 到URL 属性中.3. 在指定URL前需先设置 view 的 Applicat ...

  8. [USACO1.3]虫洞

    Luogu链接 题目描述 农夫约翰爱好在周末进行高能物理实验的结果却适得其反,导致N个虫洞在农场上(2<=N<=12,n是偶数),每个在农场二维地图的一个不同点. 根据他的计算,约翰知道他 ...

  9. [转]华 使用npm安装一些包失败了的看过来(npm国内镜像介绍)

     发布于 5 年前  作者 wppept  275957 次浏览  最后一次编辑是 1 年前 这个也是网上搜的,亲自试过,非常好用! 镜像使用方法(三种办法任意一种都能解决问题,建议使用第三种,将配置 ...

  10. Django【进阶】信号

    -信号 Django中提供了“信号调度”,用于在框架执行操作时解耦.通俗来讲,就是一些动作发生的时候,信号允许特定的发送者去提醒一些接受者.   问题:如何对所有数据库添加操作进行日志记录? 问题:信 ...