安卓之Service详解(一)
来源:互联网 发布:caffe 源码 github 编辑:程序博客网 时间:2024/06/12 16:23
本篇主要讲述StartedService
1.使用方法
1>Service的生命周期
通过上图可以发现,Service的生命周期及具体方法比Activity少很多,Service的主要核心逻辑都是写在onStartCommand()方法中,
2>通过下面Demo我们来一起学习Service
上图可以看到我用startService方法开启了一个service,具体操作如下
首先,新建一个类继承Service,在这直接上源码
(源码主要涉及生命周期和数值传递)
public class MyService extends Service { @Override public IBinder onBind(Intent intent) { // TODO: Return the communication channel to the service. throw new UnsupportedOperationException("Not yet implemented"); } //服务被创建 @Override public void onCreate() { super.onCreate(); Log.e("TAG", "My Service Create!"); } //在这里面写方法的核心任务 @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.e("TAG", "传递的数据 ====== "+intent.getStringExtra("msg")); for (int i = 0; i < 50; i++) { System.out.println("onStartCommand"+i); if(i == 30) { this.stopSelf(); break; } } return super.onStartCommand(intent, flags, startId); } @Override public void onDestroy() { super.onDestroy(); Log.e("TAG", "My Service Destroys"); }}
下面是MainActivity.Java
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void start(View view) { Intent intent = new Intent(this,MyService.class); intent.putExtra("msg","哈哈哈哈哈哈MyService"); startService(intent); Toast.makeText(this, "Service已开启", Toast.LENGTH_SHORT).show(); } public void stop(View view) { Intent intent = new Intent(this,MyService.class); stopService(intent); Toast.makeText(this, "service已停止", Toast.LENGTH_SHORT).show(); }}布局文件就两个按钮,就不多说了
通过运行上面的程序,我们来看一下Service的详细信息
这是LogCat的日志:
(1)可以发现先执行onCreate在执行onStartCommand方法,然后打印数值
(2)可以发现Sercice的当前运行线程是main主线程
E/TAG: My Service Create!E/TAG: 传递的数据 ====== 哈哈哈哈哈哈MyServiceI/System.out: onStartCommand0mainI/System.out: onStartCommand1mainI/System.out: onStartCommand2main在service创建成功后,再点击按钮StartService会发现OnCreate方法不再执行
所以,得出以下结论
1.oncreate 服务只会有一个实例,如果没被停止,只会创建一次2.当执行一个已经启动的服务后,会调用onstartcommand()方法来执行业务3.默认情况下服务于主线程在同一个线程中执行,如果在service中执行耗时操作必须在子线程操作4.使用startservice()启动的服务在没关闭之前会一直在后台运行
另外,onStartCommand()方法返回一个Int类型的值
【这个整数是一个描述了在系统的杀死事件中,系统应该如何继续这个服务的值】
这个返回值一共有四种常量
START_NOT_STICKY
如果系统在onStartCommand()方法返回之后杀死这个服务,那么直到接受到新的Intent对象,这个服务才会被重新创建。这是最安全的选项,用来避免在不需要的时候运行你的服务
START_STICKY
如果系统在onStartCommand()返回后杀死了这个服务,系统就会重新创建这个服务并且调用onStartCommand()方法,但是它不会重新传递最后的Intent对象,系统会用一个null的Intent对象来调用onStartCommand()方法,在这个情况下,除非有一些被发送的Intent对象在等待启动服务。这适用于不执行命令的媒体播放器(或类似的服务),它只是无限期的运行着并等待工作的到来。
START_REDELIVER_INTENT
如果系统在onStartCommand()方法返回后,系统就会重新创建了这个服务,并且用发送给这个服务的最后的Intent对象调用了onStartCommand()方法。任意等待中的Intent对象会依次被发送。这适用于那些应该立即恢复正在执行的工作的服务,如下载文件。
【请看下篇】Service 之BoundService使用
- 安卓之Service详解(一)
- 安卓之service常用用法详解
- 安卓学习笔记之service(一)
- 安卓四大组件之——Service详解
- 安卓服务Service详解
- 3.安卓service详解
- 安卓Service详解(二)
- 安卓服务Service详解
- 安卓之Service详解(三)【安卓IPC之AIDL】
- 安卓组件之Service
- Android开发学习之Service详解一
- Android进阶之(Service详解一)
- Android之Service详解(一)
- 安卓之service学习总结
- 安卓四大组件之----service
- 安卓四大组件之service服务
- 安卓四大组件之--service
- 安卓四大组件学习之Service
- opencv3_java 在已有的图像上画圆圈 CircleOnImg
- 查找算法总结(4)--平衡二叉树
- sublime入门基础和常用配置
- Kotlin学习笔记一基本类型
- 多组数据要求求出最大平台的长度
- 安卓之Service详解(一)
- HDU
- 深度学习调参技巧(六)
- 可展开和收起的LinearLayout
- 《step1:tiny Spring IoC学习一》——最基本的容器BeanFactory
- Unity3D官方资源包的下载以及从Asset Store下载后存在的位置查找
- HttpServletResponse学习
- 《Java多线程编程核心技术》
- Json