Service
2016-06-12 09:33
330 查看
Service和Thread的关系
Service是运行在主线程中的,所以执行一些耗时操作必须在service开一个子线程,那为什么不直接在activity开一个子线程呢?因为activity开一个子线程,如果activity被销毁了,那线程跟着完蛋,而且另外的activity无法对其线程进行操作,而service的运行时完全不需要依赖ui的,即使activity被销毁,哪怕程序被关闭,只要进程在,它都可以继续运行,而且所有activity都可以对service进行关联,因此,使用Service来处理后台任务,Activity就可以放心地finish,完全不需要担心无法对后台任务进行控制的情况。
普通启动service
首先创建MyService继承service重新三个方法
onCreate (服务创建时调用的)
onDestroy (服务销毁时调用的)
onStartCommand(每一次启动服务都会调用)
public class MyService extends Service { @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return null; } @Override public void onCreate() { // TODO Auto-generated method stub UserLog.Print("oncreate"); super.onCreate(); } @Override public void onDestroy() { // TODO Auto-generated method stub UserLog.Print("onDestroy"); super.onDestroy(); } /* (non-Javadoc) * @see android.app.Service#onStartCommand(android.content.Intent, int, int) * startId service启动的次数 */startId @Override public int onStartCommand(Intent intent, int flags, int startId) { // TODO Auto-generated method stub UserLog.Print("onStartCommand"+flags+"---"+startId); return super.onStartCommand(intent, flags, startId); } }
public class MainActivity extends Activity { private Intent itIntent ; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); itIntent = new Intent(this,MyService.class); } public void start(View view){ startService(itIntent); } public void stop(View view){ stopService(itIntent); }
service 和acticity的通讯 用绑定服务
可以指定service执行什么任务service:
首先在MyService里面创建一个MyBind 类继承Binder 添加需要的操作方法,比如下载downlod();
然后创建MyBind全局变量对象
bindService启动service的时候会调用onBind 方法 ,onBind把MyBind对象return出去,给ServiceConnection 接收
Mainactivity:
创建一个匿名类ServiceConnection 实现连个方法 这两个方法分别会在Activity与Service建立关联和解除关联的时候调用
bindService()方法接收三个参数,第一个参数就是刚刚构建出的Intent对象,第二个参数是前面创建出的ServiceConnection的实例,第三个参数是一个标志位,这里传入BIND_AUTO_CREATE表示在Activity和Service建立关联后自动创建Service,这会使得MyService中的onCreate()方法得到执行,但onStartCommand()方法不会执行。
如果同时点了 startService 跟bindService :
点击Stop Service按钮只会让Service停止,点击Unbind Service按钮只会让Service和Activity解除关联,一个Service必须要在既没有和任何Activity关联又处理停止状态的时候才会被销毁。
public class MyService extends Service { private MyBind myBind = new MyBind(); @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return myBind; } @Override public void onCreate() { // TODO Auto-generated method stub UserLog.Print("oncreate"); super.onCreate(); } @Override public void onDestroy() { // TODO Auto-generated method stub UserLog.Print("onDestroy"); super.onDestroy(); } /* (non-Javadoc) * @see android.app.Service#onStartCommand(android.content.Intent, int, int) * startId service启动的次数 */ @Override public int onStartCommand(Intent intent, int flags, int startId) { // TODO Auto-generated method stub UserLog.Print("onStartCommand"+flags+"---"+startId); return super.onStartCommand(intent, flags, startId); } class MyBind extends Binder{ public void downlod(){ System.out.println("执行下载任务"); } } }
public class MainActivity extends Activity { private Intent itIntent ; // private ServiceConnection serviceConnection =new ServiceConnection() { @Override public void onServiceDisco 4000 nnected(ComponentName name) { // TODO Auto-generated method stub } @Override public void onServiceConnected(ComponentName name, IBinder service) { // TODO Auto-generated method stub } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); itIntent = new Intent(this,MyService.class); } public void start(View view){ bindService(itIntent,serviceConnection , BIND_AUTO_CREATE); } public void stop(View view){ unbindService(serviceConnection); } }
相关文章推荐
- 安卓6版本中删除Apache HTTP客户端支持
- 对于为什么要使用接口的个人理解
- C# XML序列化方法及常用特性总结分析
- <p>设置字体颜色
- glxgears刷新只有60FPS解决办法
- android事件分发机制及冲突处理
- xcode7真机调试
- 设计模式
- Javascript简写条件语句(推荐)
- Deep Language Modeling for Question Answering using Keras
- 引导好评弹窗怎么做才能让用户体验更好?
- Java操作——获取文件扩展名,去掉文件扩展名
- 第十五周学习进度情况
- 指针的好处
- yii2中结合gridview如何使用modal弹窗实例代码详解
- 打造属于你的LayoutManager
- EXCEL操作替换单元格中的Alt+Enter
- 浏览器的复制到剪切板功能,兼容所有浏览器,悬浮层不能复制问题解决
- Android开发之自定义的ListView(UITableViewController)
- 如何提高码农产量,基于ASP.NET MVC的敏捷开发框架之移动端开发随笔二