Service基本用法
来源:互联网 发布:企业网络需求分析报告 编辑:程序博客网 时间:2024/06/05 09:31
1.什么是Service
服务(Service) 是 Android 中实现程序后台运行的解决方案, 它非常适合用于去执行那些不需要和用户交互而且还要求长期运行的任务。 服务的运行不依赖于任何用户界面, 即使当程序被切换到后台,或者用户打开了另外一个应用程序,服务仍然能够保持正常运行。不过需要注意的是,服务并不是运行在一个独立的进程当中的,而是依赖于创建服务时所在的应用程序进程。当某个应用程序进程被杀掉时,所有依赖于该进程的服务也会停止运行。
另外, 也不要被服务的后台概念所迷惑, 实际上服务并不会自动开启线程, 所有的代码都是默认运行在主线程当中的。 也就是说, 我们需要在服务的内部手动创建子线程, 并在这里执行具体的任务, 否则就有可能出现主线程被阻塞住的情况。
2.自定义Service
创建一个类并让该类继承Service,并重写如下方法,即可实现自定义Service
package code.xzy.com.servicedemo;import android.app.Service;import android.content.Intent;import android.os.IBinder;import android.util.Log;/** * Function:自定义Service 继承自Service * Created by XZY on 2017/6/25 17:35 * Email:hgncxzy@qq.com */public class MyService extends Service { private static final String TAG = "MyService"; @Override public void onCreate() { Log.i(TAG, "onCreate: executed"); super.onCreate(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.i(TAG, "onStartCommand:executed "); return super.onStartCommand(intent, flags, startId); } @Override public void onDestroy() { Log.i(TAG, "onDestroy:executed "); super.onDestroy(); } @Override public IBinder onBind(Intent intent) { Log.i(TAG, "onBind: executed"); return null; } @Override public boolean onUnbind(Intent intent) { Log.i(TAG, "onUnbind:executed "); return super.onUnbind(intent); }}
3.启动Service与停止Service(绑定Service与解绑Service)
package code.xzy.com.servicedemo;import android.app.Activity;import android.content.ComponentName;import android.content.Context;import android.content.Intent;import android.content.ServiceConnection;import android.os.Bundle;import android.os.IBinder;import android.util.Log;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;/** * Service的使用方法: * 1.定义一个Service * 2.启动服务/停止服务 绑定服务/解绑服务 * 3.服务的生命周期 * 4.活动和服务进行通讯 */public class MainActivity extends Activity implements OnClickListener { private static final String TAG = "MainActivity"; private Button startService, stopService, bindService, unBindService; private Intent intent; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); intent = new Intent(MainActivity.this, MyService.class); startService = (Button) findViewById(R.id.startService); stopService = (Button) findViewById(R.id.stopService); bindService = (Button) findViewById(R.id.bindService); unBindService = (Button) findViewById(R.id.unBindService); startService.setOnClickListener(this); stopService.setOnClickListener(this); bindService.setOnClickListener(this); unBindService.setOnClickListener(this); } @Override public void onClick(View view) { switch (view.getId()) { case R.id.startService: Log.i(TAG, "onClick: startService"); startService(intent); break; case R.id.stopService: Log.i(TAG, "onClick: stopService"); stopService(intent); break; case R.id.bindService: Log.i(TAG, "onClick: bindService"); bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE); break; case R.id.unBindService: Log.i(TAG, "onClick: unBindService"); unbindService(serviceConnection); break; default: break; } } private ServiceConnection serviceConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName componentName, IBinder iBinder) { Log.i(TAG, "onServiceConnected: "); } @Override public void onServiceDisconnected(ComponentName componentName) { Log.i(TAG, "onServiceDisconnected: "); } };}调用startService()后执行的方法:
06-25 18:00:51.259 20906-20906/code.xzy.com.servicedemo I/MyService: onCreate: executed06-25 18:00:51.259 20906-20906/code.xzy.com.servicedemo I/MyService: onStartCommand:executed调用stopService()后执行的方法;
06-25 18:00:56.689 20906-20906/code.xzy.com.servicedemo I/MyService: onDestroy:executed
调用bindService()后执行的方法:
06-25 18:01:07.838 20906-20906/code.xzy.com.servicedemo I/MyService: onCreate: executed06-25 18:01:07.838 20906-20906/code.xzy.com.servicedemo I/MyService: onBind: executed
调用unBindService()后执行的方法:
06-25 18:01:19.525 20906-20906/code.xzy.com.servicedemo I/MyService: onUnbind:executed 06-25 18:01:19.526 20906-20906/code.xzy.com.servicedemo I/MyService: onDestroy:executed
使用bindService/unBindService时,需要实例化一个ServiceConnection对象。
4.Service生命周期
一旦在项目的任何位置调用了 Context 的 startService()方法, 相应的服务就会启动起来,并回调 onStartCommand()方法。如果这个服务之前还没有创建过, onCreate()方法会先于onStartCommand()方法执行。服务启动了之后会一直保持运行状态,直到 stopService()或stopSelf()方法被调用。
注意虽然每调用一次 startService()方法, onStartCommand()就会执行一次, 但实际上每个服务都只会存在一个实例。 所以不管你调用了多少次 startService()方法,只需调用一次 stopService()或 stopSelf()方法,服务就会停止下来了。另外,还可以调用 Context 的 bindService()来获取一个服务的持久连接,这时就会回调服务中的 onBind()方法。类似地,如果这个服务之前还没有创建过, onCreate()方法会先于onBind()方法执行。之后,调用方可以获取到 onBind()方法里返回的 IBinder 对象的实例, 这样就能自由地和服务进行通信了。 只要调用方和服务之间的连接没有断开, 服务就会一直保持运行状态。
当调用了 startService()方法后,又去调用 stopService()方法,这时服务中的 onDestroy()方法就会执行,表示服务已经销毁了。类似地,当调用了 bindService()方法后,又去调用unbindService()方法, onDestroy()方法也会执行,这两种情况都很好理解。但是需要注意,我们是完全有可能对一个服务既调用了 startService()方法,又调用了 bindService()方法的,
这种情况下该如何才能让服务销毁掉呢?根据 Android 系统的机制, 一个服务只要被启动或者被绑定了之后, 就会一直处于运行状态, 必须要让以上两种条件同时不满足, 服务才能被
销毁。 所以, 这种情况下要同时调用 stopService()和 unbindService()方法, onDestroy()方法才会执行。这样你就已经把服务的生命周期完整地走了一遍。
当调用了 startService()方法后,又去调用 stopService()方法,这时服务中的 onDestroy()方法就会执行,表示服务已经销毁了。类似地,当调用了 bindService()方法后,又去调用unbindService()方法, onDestroy()方法也会执行,这两种情况都很好理解。但是需要注意,我们是完全有可能对一个服务既调用了 startService()方法,又调用了 bindService()方法的,
这种情况下该如何才能让服务销毁掉呢?根据 Android 系统的机制, 一个服务只要被启动或者被绑定了之后, 就会一直处于运行状态, 必须要让以上两种条件同时不满足, 服务才能被
销毁。 所以, 这种情况下要同时调用 stopService()和 unbindService()方法, onDestroy()方法才会执行。这样你就已经把服务的生命周期完整地走了一遍。
阅读全文
1 0
- Service的基本用法
- Service 基本用法
- Service的基本用法
- Service基本用法
- Android Service基本用法
- Service的基本用法
- Service基本用法
- Service的基本的用法
- Android Service的基本用法
- Service服务的基本用法
- 服务Service的基本用法
- service基本用法。看这就够了
- Andriod Service基本用法篇
- Android中service基本用法,生命周期1
- Android中service基本用法,生命周期2
- Android学习笔记-Service 基本用法
- Android Service 服务的基本用法
- service的基本用法+远程服务
- C/C++:拷贝文件
- AndroidStudio中默认不导入org.apache.http等包的解决方法
- 卡尔曼滤波器-Kalman Filter
- Ubuntu16.04安装ROS操作系统
- 编程规范——Java注释样式规范与模板
- Service基本用法
- 第一章 “开始”学习笔记(第一遍阅读)
- Java过滤器与拦截器
- unity镜头控制脚本
- java删除数组中的任意位置元素
- Linux 内核空间地址映射 高端内存 总结
- MaskFilter(滤镜)BlurMaskFilter(高斯滤镜)和EmbossMaskFilter(浮雕滤镜)的简单介绍和使用
- iOS开发中动画之点赞图标放大效果
- Spring boot下配置使用redis--template编码形式