Android Service基本知识总结(一)
一、简介
Service是Android系统的后台服务组件,适用于开发无界面、长时间运行的应用功能
Service特点如下:
没有用户界面
不会轻易被Android系统终止
在系统资源恢复后Service也将自动恢复
运行状态
可用于进程间通信
二、生命周期

创建MyService extends Service
清单文件中注册:
<service android:name=".MyService"/>
两种启动方式:
1.startService(Intent service)
1.调用startService()启动MyService,
Intent startIntent=new Intent(this,MyService.class);
startService(startIntent);
2.多次调用startService并不会多次执行MySercice中的onCreate()方法,会多次执行onStartCommand()方法
3.调用stopService()销毁MyService
Intent stopIntent=new Intent(this,MyService.class);
stopService(stopIntent);
2.bindService(Intent service, ServiceConnection conn,int flags)
1.调用startService()启动MyService,
Intent startIntent=new Intent(this,MyService.class);
startService(startIntent);
2.多次调用startService并不会多次执行MySercice中的onCreate()方法,会多次执行onStartCommand()方法
3.调用stopService()销毁MyService
Intent stopIntent=new Intent(this,MyService.class);
stopService(stopIntent);
bindService(Intent service, ServiceConnection conn,int flags)
1)在MyService中创建并声明MyBinder ,MyBinder中封装可能会执行的任务
private MyBinder mBinder=new MyBinder();
class MyBinder extends Binder {
public void downLoad(){
Log.e(TAG, "downLoad: " );
new Thread(new Runnable() {
@Override
public void run() {
// 执行具体的下载任务
}
}).start();
}
}
2)声明ServiceConnection,并在onServiceConnected中获取MyService.MyBinder
private ServiceConnection connection=new ServiceConnection() {
//activity和service创建连接时调用
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Log.e(TAG, "onServiceConnected: " );
//这里可以获取myBinder 通过myBinder里的方法 和service交互
myBinder= (MyService.MyBinder) service;
myBinder.downLoad();
}
//unbind()调用时不会调用此方法 不是解除关联的时候调用,而是发生异常时调用的
@Override
public void onServiceDisconnected(ComponentName name) {
Log.e(TAG, "onServiceDisconnected: " );
}
};
3)在MyService的onBind()方法中返回mBinder;
@Override
public IBinder onBind(Intent intent) {
Log.e(TAG, "onBind: " );
return mBinder;
}
4)调用onBind()绑定Service和Activity,启动MyService
Intent bindIntent = new Intent(this, MyService.class);
bindService(bindIntent, connection, BIND_AUTO_CREATE);
5)调用 unbindService(connection) 销毁MyService
unbindService(connection);
在activty中拿到mBinder后,就可以进行activity和service之间的交互了。
若一个Service先通过startService启动 再通过bindService启动。单独stopService()或者unbindService()都不能销毁Service,先stopService(),再unBindService()销毁MyService。
6)注意事项
1.Service是运行在主线程中的,不能直接执行耗时操作。可以在Service中创建一个子线程进行耗时操作
2.既然要在Service里也创建一个子线程,那为什么不直接在Activity里创建呢?
这是因为Activity很难对Thread进行控制,当Activity被销毁之后,就没有任何其它的办法可以再重新获取到之前创建的子线程的实例。
而且在一个Activity中创建的子线程,另一个Activity无法对其进行操作。但是Service就不同了,所有的Activity都可以与Service进行关联,
然后可以很方便地操作其中的方法,即使Activity被销毁了,之后只要重新与Service建立关联,就又能够获取到原有的Service中Binder的实例。
3.标准的Service常用格式:
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
new Thread(new Runnable() {
@Override
public void run() {
// 开始执行后台任务
}
}).start();
return super.onStartCommand(intent, flags, startId);
} class MyBinder extends Binder { public void startDownload() {
new Thread(new Runnable() {
@Override
public void run() {
// 执行具体的下载任务
}
}).start();
} }
三、代码

1.MyService
public class MyService extends Service {
private String TAG="333";
private MyBinder mBinder=new MyBinder();
@Override
public void onCreate() {
super.onCreate();
Log.e(TAG, "onCreate: " );
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.e(TAG, "onStartCommand: " );
new Thread(new Runnable() {
@Override
public void run() {
// 开始执行后台任务
}
}).start();
return super.onStartCommand(intent, flags, startId);
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
Log.e(TAG, "onBind: " );
return mBinder;
}
@Override
public void onDestroy() {
Log.e(TAG, "onDestroy: " );
super.onDestroy();
}
class MyBinder extends Binder {
public void downLoad(){
Log.e(TAG, "downLoad: " );
new Thread(new Runnable() {
@Override
public void run() {
// 执行具体的下载任务
}
}).start();
}
}
}
2.activity
public class MainActivity extends AppCompatActivity {
private String TAG="333";
private MyService.MyBinder myBinder;
private ServiceConnection connection=new ServiceConnection() {
//activity和service创建连接时调用
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Log.e(TAG, "onServiceConnected: " );
//这里可以获取myBinder 通过myBinder里的方法 和service交互
myBinder= (MyService.MyBinder) service;
myBinder.downLoad();
}
//unbind()调用时不会调用此方法 不是解除关联的时候调用,而是发生异常时调用的
@Override
public void onServiceDisconnected(ComponentName name) {
Log.e(TAG, "onServiceDisconnected: " );
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void click(View v){
switch (v.getId()){
case R.id.button://startService
Intent startIntent=new Intent(this,MyService.class);
startService(startIntent);
break;
case R.id.button2://stopService
Intent stopIntent=new Intent(this,MyService.class);
stopService(stopIntent);
break;
case R.id.button3:
Intent bindIntent = new Intent(this, MyService.class);
bindService(bindIntent, connection, BIND_AUTO_CREATE);
break;
case R.id.button4:
unbindService(connection);
break;
}
}
}
参考:
Android Service基本知识总结(一)的更多相关文章
- Android Service基础知识你知道多少?
Android四大组件-Service 多次调用startService会怎样?会执行多次onCreate吗? StopService在哪里调用?stopSelf在哪调用? 怎样使Service被ki ...
- Android Service使用拾遗[阿里工程师分享]
Service作为android的四大组件之一常用来帮助我们完成一些需要放在后台处理的任务,通过startService和bindService两种方式被调用.因为Service也是在主线程中运行的, ...
- Android Service AIDL 远程调用服务 【简单音乐播放实例】
Android Service是分为两种: 本地服务(Local Service): 同一个apk内被调用 远程服务(Remote Service):被另一个apk调用 远程服务需要借助AIDL来完成 ...
- android图形基础知识
Android核心分析(23)-----Andoird GDI之基本原理及其总体框架 2010-06-13 22:49 18223人阅读 评论(18) 收藏 举报 AndroidGDI基本框架 在An ...
- Android Service用法知识点的讲解
Android Service 学习Service相关知识点: android service 的基础知识,生命周期,service分类,运行地点(本地服务,远程服务),运行类型(前台服务,后台服务) ...
- android service两种启动方式
android service的启动方式有以下两种: 1.Context.startService()方式启动,生命周期如下所示,启动时,startService->onCreate()-> ...
- 1、Android Studio集成极光推送(Jpush) 报错 java.lang.UnsatisfiedLinkError: cn.jpush.android.service.PushProtoco
Android studio 集成极光推送(Jpush) (华为手机)报错, E/JPush: [JPushGlobal] Get sdk version fail![获取sdk版本失败!] W/Sy ...
- Android Service完全解析,关于服务你所需知道的一切(下)
转载请注册出处:http://blog.csdn.net/guolin_blog/article/details/9797169 在上一篇文章中,我们学习了Android Service相关的许多重要 ...
- Android Service完全解析,关于服务你所需知道的一切(上)
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/11952435 相信大多数朋友对Service这个名词都不会陌生,没错,一个老练的A ...
随机推荐
- 通过docker构建zabbix监控系统
下载zabbix的镜像 $ docker pull berngp/docker-zabbix Using default tag: latest latest: Pulling from berngp ...
- 在window下 进入系统盘命令
示例: cd C:\work 查看文件夹直接在当前路径下输入 dir 在当前路径下输入 dir/? 查看帮助
- python开发调用基础:模块的调用&制作包&软件开发规范
一,包的调用 #!/usr/bin/env python #_*_coding:utf-8_*_ #调用 glance[1..4]\api\policy.py 路径 # policy.py 内容 # ...
- Python中常用模块一
random模块 import random # 应用数学计算 print(random.random()) # 取随机小数 范围是 0-1之间 # 应用抽奖 , 彩票 print(random.ra ...
- Tuple、list的区别以及dict和set
元组(Tuple): 定义方法:使用小括号() 使用方法: count:可以统计某个元组段在整个元组中出现的次数 index:可以查询某个元组段在整个元组中的元组号 name_tuple = ('xi ...
- 关于性能测试中LR的pacing time设置的相关实验
最近项目中遇到相关性能测试不同方法产生的争议,我这就这个问题在测试环境做了个实验,得出一些指标数据间的有趣关系,供大家讨论学习: 预备知识点: 业界有个TPS ,ART和实际并发量三者间的模拟换算公式 ...
- 关于jquery在页面初始化时radio控件选定默认值的问题
网上找了很多资料,都是比较旧版本的方法,新版的jquery都已经抛弃了. 正确的代码是 $('input:radio[name="statusRadios"][value=&quo ...
- Eclipse使用hibernate插件反向生成实体类和映射文件
一般dao层的开发是这样的,先进行数据库的设计,什么E-R图之类的那些,然后选择一款数据库产品,建好表.最后反向生成Java实体和映射文件,这样可以保证一致性和便捷性. 如果用myeclipse,逆向 ...
- easylogging++学习记录(一):接入
easylogging++是一个非常轻量级并且非常高效的一个日志库,支持文件配置,支持线程安全,并且其自定义格式非常的方便,最关键的是,其所有代码都集中在一个.h头文件之中,完全不需要引用第三方库,接 ...
- C#使用HttpHelper类抓取html网页内容
HttpHelper类(苏飞版)下载地址: http://www.sufeinet.com/thread-3-1-1.html 使用方法及说明(摘自:http://blog.csdn.net/smar ...