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 ...
随机推荐
- GO数组和切片
数组Array 定义数组的格式:var <varName>[n]<type>,n>0 数组长度也是类型的一部分,因此具有不同长度的数组为不同类型, 不同类型的不能相互赋值 ...
- SCSI, (P)ATA, SAS, NL-SAS and SATA, what’s the difference?
Everybody needs storage space nowadays. Whether it is used for high performance computing or simply ...
- Java-Maven-Runoob:Maven POM
ylbtech-Java-Maven-Runoob:Maven POM 1.返回顶部 1. Maven POM POM( Project Object Model,项目对象模型 ) 是 Maven 工 ...
- (转) Docker - Docker1.12服务发现,负载均衡和Routing Mesh
看到一篇介绍 Docker swarm以及如何编排的好文章,挪放到这里,自己学习的同时也分享出来. 原文链接: http://wwwbuild.net/dockerone/414200.html -- ...
- mongoDB的了解
一.什么是mongoDB? 1.MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统.在高负载的情况下,添加更多的节点,可以保证服务器性能. 2.MongoDB 旨在为WEB ...
- 7.solr学习速成之facet
Facet 介绍 Facet 是 solr 的高级搜索功能之一 ,可以给用户提供更友好的搜索体验,在搜索关键字的同时 , 能够按照 Facet 的字段进行分组并统计. 比如你上淘宝, ...
- 关于datagridview自动增加行高度和显示全部内容的设置
this.dataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCellsExceptHeaders; //自动调动dat ...
- leetcode583
public class Solution { public int MinDistance(string word1, string word2) { , word2.Length + ]; ; i ...
- linux rz -e
linux shell rz和sz是终端下常用的文件传输命令,rz和sz通过shell被调用,其中rz用于从启用终端的系统上传文件到目标系统(终端登录的目标系统), 这里不过多介绍这些命令,只是记录一 ...
- mysql 批量插入与单条插入 的效率比较
1.数据插入性能(单个插入和批量插入) public class Test { private Long id; private String test; public Long getId() { ...