- 浏览: 570199 次
- 性别:
- 来自: 厦门
文章分类
- 全部博客 (669)
- oracle (36)
- java (98)
- spring (48)
- UML (2)
- hibernate (10)
- tomcat (7)
- 高性能 (11)
- mysql (25)
- sql (19)
- web (42)
- 数据库设计 (4)
- Nio (6)
- Netty (8)
- Excel (3)
- File (4)
- AOP (1)
- Jetty (1)
- Log4J (4)
- 链表 (1)
- Spring Junit4 (3)
- Autowired Resource (0)
- Jackson (1)
- Javascript (58)
- Spring Cache (2)
- Spring - CXF (2)
- Spring Inject (2)
- 汉字拼音 (3)
- 代理模式 (3)
- Spring事务 (4)
- ActiveMQ (6)
- XML (3)
- Cglib (2)
- Activiti (15)
- 附件问题 (1)
- javaMail (1)
- Thread (19)
- 算法 (6)
- 正则表达式 (3)
- 国际化 (2)
- Json (3)
- EJB (3)
- Struts2 (1)
- Maven (7)
- Mybatis (7)
- Redis (8)
- DWR (1)
- Lucene (2)
- Linux (73)
- 杂谈 (2)
- CSS (13)
- Linux服务篇 (3)
- Kettle (9)
- android (81)
- protocol (2)
- EasyUI (6)
- nginx (2)
- zookeeper (6)
- Hadoop (41)
- cache (7)
- shiro (3)
- HBase (12)
- Hive (8)
- Spark (15)
- Scala (16)
- YARN (3)
- Kafka (5)
- Sqoop (2)
- Pig (3)
- Vue (6)
- sprint boot (19)
- dubbo (2)
- mongodb (2)
最新评论
1.Service基本概念
Service是Android中四大组件之一,是一个没有用户界面的在后台运行执行耗时操作的应用组件。其他应用组件能够启动Service,并且当用户切换到另外的应用场景,Service将持续在后台运行。另外,一个组件能够绑定到一个service与之交互(IPC机制),例如,一个service可能会处理网络操作,播放音乐,操作文件I/O或者与内容提供者(content provider)交互,所有这些活动都是在后台进行。
那么,什么时候,我们需要使用service呢?
我们知道,service是运行在后台的应用,对于用户来说失去了被关注的焦点。这就跟我们打开了音乐播放之后,便想去看看图片,这时候我们还不想音乐停止,这里就会用到service;又例如,我们打开了一个下载链接之后,我们肯定不想瞪着眼睛等他下载完再去做别的事情,对吧?这时候如果我们想手机一边在后台下载,一边可以让我去看看新闻啥的,就要用到service。
Service有两种状态,“启动的”和“绑定”。
2.Service生命周期
Service也有自己的生命周期,前面我们使用到的onCreate,onStartCommand,onBind和onDestroy等方法都是在服务的生命周期内可能回调的方法。
一旦在项目的任何位置调用了Context的startService(intent)方法,相应的服务就会启动起来,并回调onStartCommand。如果 这个服务之前还没创建过,onCreate()方法会先于onStartCommand()方法执行。
服务启动了之后一直保持运行状态,直到stopService(intent)或stopSelf()方法被调用。
注意虽然每调用一次startService()方法,onStartCommand()就会执行一次,但实际上每个服务都只会存在一个实例。所以不管你调用了多少次startService(intent)方法,只需调用一次stopService()或stopSelf()方法,服务就会停止下来了。
另外,还可以调用Context的bindService()来获取一个服务的持久连接,这时就会回调服务中的onBind()方法。类似地,如果这个服务之前还没有创建过,onCreate()方法会先于onBind()方法执行。之后,调用方可以获取到onBind()方法里返回的IBinder对象的实例,这样就能自由地和服务进行通信了。只要调用方和服务之间的连接没有断开,服务就会一直保持运行状态。
当调用了startService()方法后,又去调用stopService()方法,这时服务中的onDestroy()方法就会执行,表示服务已经销毁了。类似地,当调用了bindService()方法后,又去调用unbindService()方法,onDestroy()方法也会执行,这两种情况都很好理解。但是需要注意,我们是完全有可能对一个服务既调用了startService()方法,又调用了bindService()方法的,这种情况下该如何才能让服务销毁掉?
根据android系统的机制,一个服务只要被启动或者绑定了之后就会一直处于运行状态,必须要让以上两种条件同时不满足,服务才能被销毁。所以,这种情况下需要同时调用stopService()和unbindService()方法,onDestroy()方法才会执行。
3.案例
ServiceDemo
Manifest
Service是Android中四大组件之一,是一个没有用户界面的在后台运行执行耗时操作的应用组件。其他应用组件能够启动Service,并且当用户切换到另外的应用场景,Service将持续在后台运行。另外,一个组件能够绑定到一个service与之交互(IPC机制),例如,一个service可能会处理网络操作,播放音乐,操作文件I/O或者与内容提供者(content provider)交互,所有这些活动都是在后台进行。
那么,什么时候,我们需要使用service呢?
我们知道,service是运行在后台的应用,对于用户来说失去了被关注的焦点。这就跟我们打开了音乐播放之后,便想去看看图片,这时候我们还不想音乐停止,这里就会用到service;又例如,我们打开了一个下载链接之后,我们肯定不想瞪着眼睛等他下载完再去做别的事情,对吧?这时候如果我们想手机一边在后台下载,一边可以让我去看看新闻啥的,就要用到service。
Service有两种状态,“启动的”和“绑定”。
2.Service生命周期
Service也有自己的生命周期,前面我们使用到的onCreate,onStartCommand,onBind和onDestroy等方法都是在服务的生命周期内可能回调的方法。
一旦在项目的任何位置调用了Context的startService(intent)方法,相应的服务就会启动起来,并回调onStartCommand。如果 这个服务之前还没创建过,onCreate()方法会先于onStartCommand()方法执行。
服务启动了之后一直保持运行状态,直到stopService(intent)或stopSelf()方法被调用。
注意虽然每调用一次startService()方法,onStartCommand()就会执行一次,但实际上每个服务都只会存在一个实例。所以不管你调用了多少次startService(intent)方法,只需调用一次stopService()或stopSelf()方法,服务就会停止下来了。
另外,还可以调用Context的bindService()来获取一个服务的持久连接,这时就会回调服务中的onBind()方法。类似地,如果这个服务之前还没有创建过,onCreate()方法会先于onBind()方法执行。之后,调用方可以获取到onBind()方法里返回的IBinder对象的实例,这样就能自由地和服务进行通信了。只要调用方和服务之间的连接没有断开,服务就会一直保持运行状态。
当调用了startService()方法后,又去调用stopService()方法,这时服务中的onDestroy()方法就会执行,表示服务已经销毁了。类似地,当调用了bindService()方法后,又去调用unbindService()方法,onDestroy()方法也会执行,这两种情况都很好理解。但是需要注意,我们是完全有可能对一个服务既调用了startService()方法,又调用了bindService()方法的,这种情况下该如何才能让服务销毁掉?
根据android系统的机制,一个服务只要被启动或者绑定了之后就会一直处于运行状态,必须要让以上两种条件同时不满足,服务才能被销毁。所以,这种情况下需要同时调用stopService()和unbindService()方法,onDestroy()方法才会执行。
3.案例
ServiceDemo
package com.test.service; import android.app.Service; import android.content.Intent; import android.os.Binder; import android.os.IBinder; public class ServiceDemo extends Service { private int progress ; //开启线程动态的修改progress private Thread thread = new Thread(){ @Override public void run() { while(progress < 10){ progress++; try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); break ; } } } }; public class MessageBinder extends Binder{ //用于activity使用 public int getProgress() { return progress; } } @Override public IBinder onBind(Intent intent) { System.out.println("service 已绑定"); thread.start(); return new MessageBinder(); } @Override public void onCreate() { System.out.println("service 已创建"); } @Override public int onStartCommand(Intent intent, int flags, int startId) { System.out.println("service已启动"); return super.onStartCommand(intent, flags, startId); } @Override public void onDestroy() { super.onDestroy(); System.out.println("service停止"); } @Override public boolean onUnbind(Intent intent) { System.out.println("service解除绑定"); thread.interrupt(); return super.onUnbind(intent); } }
package com.test.activity; import android.app.Activity; import android.app.Service; import android.content.ComponentName; import android.content.Intent; import android.content.ServiceConnection; import android.os.Bundle; import android.os.Handler; import android.os.IBinder; import android.os.Message; import android.view.View; import android.view.View.OnClickListener; import android.view.Window; import android.widget.Button; import android.widget.ProgressBar; import android.widget.TextView; import com.test.R; import com.test.service.ServiceDemo; public class ServiceActivity extends Activity { private Button startServiceButton; private Button stopServiceButton; private Button bindServiceButton; private Button unbindServiceButton; private Button getServiceValueButton; private static TextView textView; private static ProgressBar progressBar; // 判断service是否启动 private boolean isServiceStarted = false ; int progress; // Activity和Service通信的桥梁 private ServiceDemo.MessageBinder binder; private static Handler handler = new Handler() { @Override public void handleMessage(Message msg) { textView.setText("Service中获取的值:" + msg.arg1); progressBar.setProgress(msg.arg1); } }; // 用于得到binder对象 private ServiceConnection connection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { System.out.println("Service 连接"); binder = (ServiceDemo.MessageBinder) service; } @Override public void onServiceDisconnected(ComponentName name) { System.out.println("Service 断开连接"); } }; private final Thread thread = new Thread() { @Override public void run() { System.out.println("线程已启动"); Message message = null; while ((progress = binder.getProgress()) <= 10) { message = handler.obtainMessage(); message.arg1 = progress; message.sendToTarget(); try { Thread.sleep(1000); } catch (InterruptedException e) { System.out.println("线程已终止"); break; } //跳出线程 if(progress == 10){ break ; } } unbindService(connection); isServiceStarted = false; } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.service); startServiceButton = (Button) findViewById(R.id.startService); stopServiceButton = (Button) findViewById(R.id.stopService); bindServiceButton = (Button) findViewById(R.id.bindService); unbindServiceButton = (Button) findViewById(R.id.unbindService); getServiceValueButton = (Button) findViewById(R.id.getServiceValue); textView = (TextView) findViewById(R.id.serviceText); progressBar = (ProgressBar) findViewById(R.id.progressBar); final Intent intent = new Intent(); intent.setAction("COM.TEST.SERVICE.SERVICEDEMO"); // 开启service startServiceButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { startService(intent); } }); // 停止service stopServiceButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { stopService(intent); } }); // 绑定service bindServiceButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if(!isServiceStarted){ isServiceStarted = true; bindServiceButton.setClickable(false); bindService(intent, connection, Service.BIND_AUTO_CREATE); } } }); // 解除绑定service unbindServiceButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (!thread.isInterrupted()) { thread.interrupt(); } if (isServiceStarted) { unbindService(connection); isServiceStarted = false; } bindServiceButton.setClickable(true); } }); // 获取service内容 getServiceValueButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { System.out.println(thread.isInterrupted()); if (!thread.isInterrupted()) { thread.start(); } } }); } }
Manifest
<service android:name=".service.ServiceDemo" android:exported="false" > <intent-filter> <action android:name="COM.TEST.SERVICE.SERVICEDEMO" /> </intent-filter> </service>
发表评论
文章已被作者锁定,不允许评论。
-
android BaseActivity与BaseFragment的封装
2016-05-19 15:06 9511 概述 多模块Activity+多Fragment 是开发 ... -
android ScrollView常用属性
2016-05-09 09:17 657android:scrollbars 设置滚动条显示。none ... -
android RecyclerView使用及详解
2016-05-04 10:35 28521.前言 话说RecyclerView已经面市很久,也在很多 ... -
android DialogFragment 创建对话框(官方推荐)
2016-04-29 14:22 8541、 概述 DialogFragment在android 3. ... -
android Intent Flags及Task相关属性
2016-04-26 09:15 563task是一个具有栈结构的容器,可以放置多个Activity实 ... -
android SQLite具体实例应用详解(SQLiteOpenHelper)
2016-04-18 19:24 763上次我向大家介绍了SQLite的基本信息和使用过程,相信朋友们 ... -
android SQLite3常用命令&语法
2016-04-18 19:01 562sqlite数据库只用一个文件就ok,小巧方便,所以是一个非常 ... -
android View绘制相关问题总结
2016-03-28 19:27 6321.View的绘制流程分几步 ... -
android Handler Looper MessageQueue机制的原理
2016-03-22 21:09 721andriod提供了Handler和Looper来满足线程间的 ... -
android Bitmap,BitmapFactory类图像处理
2016-03-16 16:28 2317BitMap代表一张位图,扩展名可以是.bmp或者.dib。 ... -
android 三类菜单(Option) (Context) (SubMenu)学习
2016-03-14 15:23 866在Android系统中,菜单可以分为三类:选项菜单(Optio ... -
android Sqlite数据库对象模型ORMLite框架学习
2016-03-11 15:24 665在Android项目中或多或少的都会使用数据库,为了提高我们的 ... -
android AsyncTask<参数,进度值类型,返回类型>学习
2016-03-10 14:45 1131AsyncTask和Handler对比 1 ... -
android 远程图片获取和本地缓存
2016-03-10 14:32 715概述 对于客户端——服 ... -
android onSaveInstanceState和onRestoreInstanceState学习
2016-03-10 10:08 740Android中的activity通过onSaveInst ... -
android Fragment生命周期和回退栈学习以及Fragment之间通信
2016-03-10 09:31 1485会涉及到Fragment如何产生,什么是Fragment,Fr ... -
android LruCache内存缓存学习(重写sizeOf方法)
2016-03-09 19:25 1012什么是缓存? 缓存技术原理就是把用户访问的所有对象看作一个全 ... -
android ListView中的convertView缓存及使用
2016-03-09 19:12 1657一、复用convertView 首先讲下ListView的原 ... -
android 从资源角度谈Android代码内存优化
2016-03-09 18:54 660开发人员如果在进行代码编写之前就有内存泄露方面的基础知识,那么 ... -
android startActivityForResult和setResult详情及Demo
2016-03-09 08:56 999startActivityForResult与startAct ...
相关推荐
Android Service与BroadcastReceiver、bindService示例详解,代码非常详细,详解博客网址:http://blog.csdn.net/sunboy_2050/article/details/7364024
实例详解Android中startService()和bindService()的区别。 说明详见http://blog.csdn.net/a343902152/article/details/50857316
NULL 博文链接:https://trylovecatch.iteye.com/blog/1163300
音乐播放器学习下bindservice和startService。
最近在开发过程中遇到相关问题,在此记录过程及解决思路。
andrid service 两种启动方式:第一种startservice,第二种bindservice,大家对这两种启动方式的区别了解吗,下面跟着小编一起学习吧
StartService和BindService实现播放音乐的样例
学习顺序 testService testBindService testIntenService testAidlClient+testAIDL
Android中有两种主要方式使用Service,通过调用Context的startService方法或调用Context的bindService方法,本文只探讨纯bindService的使用,不涉及任何startService方法调用的情况。如果想了解startService相关的...
Android的startservice和bindservice
android service使用的小demo 包括startService stopService bindService unbindService 两种开启、关闭service的小demo
多次调用bindService()方法并不会导致多次创建服务及绑定(也就是说onCreate()和onBind()方法并不会被多次调用,但是多次执行bindService)
安卓开发学习的各种资料以及对应的demo 开源客户端学习研究 准备通过这个客户端深入学习。...深入理解Android的startservice和bindservice Android Studio权威教程专栏 各种源码解析分析 值得阅读的android技术文章
Android中有两种主要方式使用Service,通过调用Context的startService方法或调用Context的bindService方法,本文只探讨纯startService的使用,不涉及任何bindService方法调用的情况。如果想了解bindService的相关...
startService和bindService的2个demo
目录里AIDLClient为service的使用方,MyApplication为service的提供方;服务很简单,仅提供加法计算;
Android四大组件之绑定Service详解,示例代码:附带博客地址: https://blog.csdn.net/lijianbiao0/article/details/85067100
Android bindservice失败解决方法 现象: this.bindService(bindIntent, conn, Context.BIND_AUTO_CREATE); 相同的代码以前使用一直很正常,但最近在项目中使用却一直绑定失败,bindservice返回false。 原因: 使用...