Service 定义(startService、bindService、IntentService)
Service:
是Android中实现程序后台运行的解决方案。
定义为服务
Service默认并不会运行在子线程中,它也不会运行在一个独立的进程中,它同样执行在UI线程中,因此,不要在Service中执行耗时的操作,如果需要执行耗时的操作,可以在Service中创建子线程来完成耗时操作。
什么是手机病毒?
手机病毒是编制者在手机程序中插入带破坏数据。吸费。监控等功能的代码,能影响手机使用,能自我复制的一组指令或者程序代码。
病毒的共性是拥有潜伏性,触发性,传染性,破坏性。
病毒都是偷偷的在后台执行预设的功能。
为什么要用Service?
大部分病毒利用Service的特点,可以不知不觉(后台)完成预设的功能。
作为Android工程师,至少需要了解Service是如何在后台完成预设功能。
在真实的商业项目中都有定期在后台执行任务(如:下载,上传等)的需求。
当某个功能需要执行很长时间(如:下载,收集数据等),并且在执行过程中不需要让用户操作,不需要Activity进行交互的情况下,可以通过Service在后台完成指定任务。
Service有几种启动模式?
有两种启动模式:
startService()启动方式:主要用于执行后台计算
bindService()启动方式:主要用于和其它组件的交互
startService的特点及优缺点?
Service会经历 onCreate –> onStart stopService的时候直接onDestroy
如果是 调用者直接退出而没有调用stopService的话,Service会一直在后台运行。 下次调用者再起来仍然可以stopService。
bindService 的特点及优缺点?
Service只会运行onCreate, 这个时候 调用者和Service绑定在一起
调用者退出了,Srevice就会调用onUnbind–>onDestroyed 所谓绑定在一起就共存亡了。
两者放在一块的代码演示:
package com.example.myapplication15;import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Binder;
import android.os.IBinder;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;public class MainActivity extends AppCompatActivity implements View.OnClickListener{private Button btn_start;
private Button btn_end;
private Button bind;
private Button unbind;
private Button main;private MyService.DownloadBinder downloadBinder;private ServiceConnection connection = new ServiceConnection() {@Overridepublic void onServiceConnected(ComponentName componentName, IBinder iBinder) {downloadBinder = (MyService.DownloadBinder) iBinder;downloadBinder.startDownload();downloadBinder.getProgress();}@Overridepublic void onServiceDisconnected(ComponentName componentName) {}};DownLoadBinder downLoadBinder=new DownLoadBinder();public class DownLoadBinder extends Binder{public void startDownload(){}}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);btn_start=findViewById(R.id.btn_start);btn_end=findViewById(R.id.btn_end);btn_start.setOnClickListener(this);btn_end.setOnClickListener(this);bind = findViewById(R.id.main_bind);unbind = findViewById(R.id.main_unbind);bind.setOnClickListener(this);unbind.setOnClickListener(this);main=findViewById(R.id.main2_btn);main.setOnClickListener(this);}@Overridepublic void onClick(View view) {switch (view.getId()){case R.id.main_bind:Intent bindIntent = new Intent(this, MyService.class);bindService(bindIntent, connection, BIND_AUTO_CREATE);break;case R.id.main_unbind:unbindService(connection);break;case R.id.btn_start:Intent statintent=new Intent(MainActivity.this,MyService.class);startService(statintent);break;case R.id.btn_end:Intent endintent=new Intent(MainActivity.this,MyService.class);stopService(endintent);break;case R.id.main2_btn:Intent intent=new Intent(MainActivity.this,Main2Activity.class);startActivity(intent);default:break;}}
}
布局文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context="com.example.myapplication15.MainActivity"><Button
android:text="开始"android:layout_marginTop="50dp"android:id="@+id/btn_start"android:layout_gravity="center"android:layout_width="80dp"android:layout_height="50dp" /><Button
android:text="结束"android:layout_marginTop="50dp"android:id="@+id/btn_end"android:layout_gravity="center"android:layout_width="80dp"android:layout_height="50dp" /><Button
android:id="@+id/main_bind"android:text="绑定"android:layout_marginTop="50dp"android:layout_gravity="center"android:layout_width="80dp"android:layout_height="50dp" /><Button
android:id="@+id/main_unbind"android:text="解绑"android:layout_marginTop="50dp"android:layout_gravity="center"android:layout_width="80dp"android:layout_height="50dp" /><Button
android:id="@+id/main2_btn"android:layout_width="match_parent"android:layout_height="50dp"android:text="转到main2"/>
</LinearLayout>
写一个类继承service:
package com.example.myapplication15;import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;import static android.content.ContentValues.TAG;public class MyService extends Service {private DownloadBinder mBinder=new DownloadBinder();class DownloadBinder extends Binder {public void startDownload(){Log.e(TAG, "MyService: "+"startDownload ");}public int getProgress(){Log.e(TAG, "MyService: "+"getProgress ");return 0;}}public MyService() {}@Overridepublic IBinder onBind(Intent intent) {// TODO: Return the communication channel to the service.return mBinder;}@Overridepublic void onCreate() {super.onCreate();Log.e("Myservice", "onCreate: executed" );}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {Log.e("Myservice", "onStartCommand: executed" );new Thread(new Runnable() {@Overridepublic void run() {for (int i=0;i<10;i++){Log.e("Service"+ Thread.currentThread().getName(),i+"***" );try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}}).start();return super.onStartCommand(intent, flags, startId);}@Overridepublic void onDestroy() {super.onDestroy();Log.e("Myservice"+Thread.currentThread().getName() ,"onDestroy: executed" );}
}
当点击开始的时候 log出如图的效果:
当点击结束的时候:
当再次连续点击开始时,oncreate 只是被执行了一次。而onStartCommand可以被执行很多次:
当点击绑定的时候:
当点击解绑的时候 执行销毁:
IntentService的特点及其优缺点?
1是一种服务,比较适合高优先级的后台任务
2.任务结束自动退出
3.IntentService是Service的子类,用来处理异步请求,IntentService在onCreate()通过HandlerThread开启一个线程
Service 定义(startService、bindService、IntentService)相关推荐
- Android 在Service中使用bindService
前面已经对Service的startServer方式启动一个服务了解过了,现在来看一下Service的另一种启动方式→bindServer bindServer使用场景 1.在同个app之间调用(即是 ...
- Android开发面试题Service之startService和bindService之间的区别
我们从生命周期来看: startService启动service会走=>onCreate和onStartCommand bindService启动service会走=>onCreate和o ...
- Service混合开启笔记(startService+bindService)
startService方式单独启动服务 startService()-onCreate-onStart stopService()-onDestroy ----------------------- ...
- Android面试题Service,Android面试题-IntentService源码分析
自定义控件 联网 工具 数据库 源码分析相关面试题 Activity相关面试题 Service相关面试题 与XMPP相关面试题 与性能优化相关面试题 与登录相关面试题 与开发相关面试题 与人事相关面试 ...
- android组件启动,Android四大组件Service之StartService启动
对于Service两种方式在概述里已经介绍了,下面是学习是StartService的代码实例. service启动代码: package com.example.service01; import a ...
- android中Service使用startService
一.什么是Service? Service(服务)是一个一种可以在后台执行长时间运行操作而没有用户界面的应用组件.服务可由其他应用组件启动(如Activity),服务一旦被启动将在后台一直运行,即 ...
- android service使用handle,android中对Looper、HandlerThread、IntentService的理解及使用方法...
消息队列处理模型 容器保存事件,队列 涉及到角色: 类 功能 MessageQueue 存放消息 Looper 轮循消息队列,从中取出消息 Thread 处理消息 Message 消息 Handler ...
- Android之Service与IntentService的比较
Android之Service与IntentService的比较 不知道大家有没有和我一样,以前做项目或者练习的时候一直都是用Service来处理后台耗时操作,却很少注意到还有个IntentServ ...
- Service startService方式的服务
简介:Android中的服务和windows中的服务是类似的东西,服务一般没有用户操作界面,它运行于系统中不容易被用户发觉,可以使用它开发如监控或下载之类的程序.服务的开发比较简单,如下: 第一步:继 ...
最新文章
- pip 将 某包指定到某目录 批量安装
- .NET Core 3.0之深入源码理解Host(二)
- python几行代码识别验证码_Python有多强?文字识别(验证码识别)只需三行代码!...
- LeetCode4. 寻找两个有序数组的中位数
- 修改现有用户帐户的 Microsoft Lync Server 2010 属性
- Vue角色的权限管理
- RocketMQ 实战-SpringBoot整合RocketMQ同步消息、异步消息、单向消息
- JointJS绘制流程图
- IP转发引擎的三种核心处理器区别介绍
- python和java md5加密,如何将javamd5加密代码移植到Python中?
- android 数据存储之SQLite
- 漏洞扫描工具Nessus的下载与安装教程
- Java爬坑--集合(二)List
- rovio环境配置与测试笔记
- BGP双线IDC机房的接入方式
- Java常用类--日期时间相关的类
- IT服务公司经理专栏:小公司管理(3)
- Powershell 添加开机启动项
- 微信小程序:图片404错误,更换默认图片
- numpy获得前n大元素下标
热门文章
- kong翻译_Kong[孔]的中文翻译及英文名意思
- 【STM32CubeIDE】将变量定义到指定地址
- VS Code + GCC 搭建 STM32 开发环境
- linux安装nuke教程下载,Nuke7.0v8下载为windonws、Mac和Linux
- 极客日报第4期:爆料 华为鸿蒙手机 OS 开发者 Beta 版预计 12 月 18 日开放;程序员的幸福指数是如何下降的?
- spring源码分析系列(一)
- 使用windows远程连接kali的桌面
- 说一下软件测试行业的优缺点
- 0716 POJ1222 EXTENDED LIGHTS OUT
- C语言循环四要素是那些,基于信息化的c语言中循环语句的教学设计探讨