Android学习--探究服务(二)
服务的基本用法
定义服务: 我们需要先创建服务,我们要使用就的利用一个类去继承它,然后重写它的几个方法,具体的我们看下面的代码:

我们重写了下面三个方法:
* 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生命周期流程图:

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

服务使用的两个小技巧

可我们还有更简单的方法来做这件事,利用我们要说的 IntentService
Android学习--探究服务(二)的更多相关文章
- Android学习--探究服务(一)
		
什么是服务? 服务(service)是Android中实现程序后台运行的解决方案,它非常适合去执行那些不需要和用户交互而且还要求长期运行的任务.服务的运行不依赖任何的用户界面,即使应用被切换到后台或者 ...
 - 【转】Pro Android学习笔记(二):开发环境:基础概念、连接真实设备、生命周期
		
在Android学习笔记(二):安装环境中已经有相应的内容.看看何为新.这是在source网站上的Android架构图,和标准图没有区别,只是这张图颜色好看多了,录之.本笔记主要讲述Android开发 ...
 - Android学习路线(二十四)ActionBar Fragment运用最佳实践
		
转载请注明出处:http://blog.csdn.net/sweetvvck/article/details/38645297 通过前面的几篇博客.大家看到了Google是怎样解释action bar ...
 - 【转】 Pro Android学习笔记(二二):用户界面和控制(10):自定义Adapter
		
目录(?)[-] 设计Adapter的布局 代码部分 Activity的代码 MyAdapter的代码数据源和构造函数 MyAdapter的代码实现自定义的adapter MyAdapter的代码继续 ...
 - 【转】 Pro Android学习笔记(二十):用户界面和控制(8):GridView和Spinner
		
目录(?)[-] GridView Spinner GridView GridView是网格状布局,如图所示.在了解ListView后,很容易了解GridView.下面是例子的XML文件. <? ...
 - Android学习路线(二十一)运用Fragment构建动态UI——创建一个Fragment
		
你能够把fragment看成是activity的模块化部分.它拥有自己的生命周期,接受它自己的输入事件,你能够在activity执行时加入或者删除它(有点像是一个"子activity&quo ...
 - 【转】 Pro Android学习笔记(二九):用户界面和控制(17):include和merge
		
目录(?)[-] xml控件代码重用include xml控件代码重用merge 横屏和竖屏landsacpe portrait xml控件代码重用:include 如果我们定义一个控件,需要在不同的 ...
 - 【转】Pro Android学习笔记(二五):用户界面和控制(13):LinearLayout和TableLayout
		
目录(?)[-] 布局Layout 线性布局LinearLayout 表格布局TableLayout 布局Layout Layout是容器,用于对所包含的view进行布局.layout是view的子类 ...
 - Android学习笔记(二)——探究一个活动
		
//此系列博文是<第一行Android代码>的学习笔记,如有错漏,欢迎指正! 活动(Activity)是最容易吸引到用户的地方了,它是一种可以包含用户界面的组件,主要用于和用户进行交互.一 ...
 
随机推荐
- timeSetEvent()函数
			
原文链接地址:http://www.cnblogs.com/kangwang1988/archive/2010/09/16/1827872.html 微软公司在其多媒体Windows中提供了精确定时器 ...
 - [SCOI2007] 蜥蜴 (最大流)
			
[SCOI2007] 蜥蜴 题目背景 07四川省选 题目描述 在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃到边界外. 每行每列中相邻石柱的距离为1 ...
 - Watto and Mechanism Codeforces Round #291 (Div. 2)
			
C. Watto and Mechanism time limit per test 3 seconds memory limit per test 256 megabytes input stand ...
 - rman异机恢复,全部恢复和增量恢复
			
1.首先准备工作:hostname 192.168.222.11 ol7.localdomain ol7建立相关目录:mkdir -p /u01/app/oracle/oradata/DB11G/mk ...
 - c++(类)构造函数、复制构造函数
			
复制构造函数是一种特殊的构造函数,它的作用是用一个已经存在的对象去初始化另一个对象.一般情况下不需要自行定义复制构造函数,系统默认提供一个逐个复制成员值的复制构造函数. 何时要使用呢? 1.将新对象初 ...
 - 解析 Array.prototype.slice.call(arguments,0)
			
Array.prototype.slice.call(arguments,0) 经常会看到这段代码用来处理函数的参数 网上很多复制粘帖说:Array.prototype.slice.call(argu ...
 - [06] JavaScript 类型
			
下面对知识点总结: 1.类型分类 a.原始类型:number, string, boolean, null, undefined b.对象类型:除了原始类型都是(例如:object,array, fu ...
 - 链接oracle数据库 生成表对应的javabean
			
package com.databi.utils; import java.io.File; import java.io.FileOutputStream; import java.io.IOExc ...
 - c#之字符串函数
			
1.常用的字符串函数 Compare 比较字符串的内容,考虑文化背景(场所),确定某些字符是否相等 int Compare(string str1,string str2) int Compare(s ...
 - Navicat Premium  mysql
			
#Sql语句 创建一表格 ),name ),age ),sex )); #添加语句 ,,'男'); ,,'男'); #删除 delete from user3;#user3中所有数据全删 delete ...