Android四大组件之Service

charon:授权和认证服务 卡龙 快速开始 安装 $ go install github.com/piotrkowalczuk/charon/cmd/charond $ go install github.com/piotrkowalczuk/charon/cmd/charonctl 超级用户 $ charonctl register -address=localhost:8080 -auth.disabled -register.superuser=true -register.username= " j.snow@gmail.com " -register.password=123 -register.firstna 立即下载

Android四大组件之Service

服务的两种开启方式:

  1. startService();开启服务.
    开启服务后 服务就会长期的后台运行,即使调用者退出了.服务仍然在后台继续运行.服务和调用者没有什么关系, 调用者是不可以访问服务里面的方法.
  2. bindService();绑定服务.
    服务开启后,生命周期与调用者相关联.调用者挂了,服务也会跟着挂掉.不求同时生,但求同时死.调用者和服务绑定在一起,调用者可以间接的调用到服务里面的方法.

AIDL

本地服务:服务代码在本应用中
远程服务:服务在另外一个应用里面(另外一个进程里面)
aidl: android interface defination language
IPC implementation : inter process communication

服务混合调用的生命周期

开启服务后再去绑定服务然后再去停止服务,这时服务是无法停止了.必须先解绑服务然后再停止服务,在实际开发中会经常采用这种模式,
开启服务(保证服务长期后台运行) –> 绑定服务(调用服务的方法) –> 解绑服务(服务继续在后台运行) –> 停止服务(服务停止),服务只会被开启一次,
如果已经开启后再去执行开启操作是没有效果的。

绑定服务调用方法的原理

  1. 定义一个接口,里面定义一个方法

    public interface IService {
        public void callMethodInService();//通过该类中提供一个方法,让自定 
    义的类实现这个接口
    }
  2. 在服务中自定义一个IBinder的实现类,让这个类继承Binder(Binder是IBinder的默认适配器),由于这个自定义类是私有的,为了其他类中能拿到该类,
    我们要定义一个接口,提供一个方法,让IBinder类去实现该接口,并在相应方法中调用自己要供别人调用的方法。

    public class TestService extends Service {
        @Override
        public IBinder onBind(Intent intent) {
            System.out.println("onbind");
            return new MyBinder();
        }
    
        private class MyBinder extends Binder implements IService{
            public void callMethodInService(){
                //实现该方法,去调用服务中的方法
                methodInService();
            }
        }
        //服务中的方法
        public void methodInService(){
            Toast.makeText(this, "我是服务里面的春哥,巴拉布拉!", 0).show();
        }
    }
  3. 服务的调用类中将onServiceConnected方法中的第二个参数强转成接口

    public class DemoActivity extends Activity {
        private Intent intent;
        private Myconn conn;
        private IService iService;
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            intent = new Intent(this,TestService.class);
            setContentView(R.layout.main);
        }
        public void start(View view) {
            startService(intent);
        }
        public void stop(View view) {
            stopService(intent);
        }
        public void bind(View view) {
            conn = new Myconn();
            //1.绑定服务 传递一个conn对象.这个conn就是一个回调接口
            bindService(intent, conn, Context.BIND_AUTO_CREATE);
        }
        public void unbind(View view) {
            unbindService(conn);
        }
        //调用服务中的方法
        public void call(View view){
            iService.callMethodInService();
        }
        private class Myconn implements ServiceConnection{
            //当服务被成功绑定的时候调用的方法.
            @Override
            public void onServiceConnected(ComponentName name, IBinder service) {//第二个参数就是服务中的onBind方法的返回值
                iService = (IService) service;
            }
            @Override
            public void onServiceDisconnected(ComponentName name) {
            }
        }
    } 

远程服务aidl

上面介绍了绑定服务调用服务中方法的原理,对于远程服务的绑定也是这样,
但是这个远程服务是在另外一个程序中的,在另外一个程序中定 义的这个接口,
在另外一个程序中是拿不到的,就算是我们在自己的应用 中也定义一个一模一样
的接口,但是由于两个程序的报名不同,这两个接口也是不一样的,为了解决这个
问题,谷歌的工程师给提供了aidl,我们将定义的这个接口的.java改成 .aidl,
然后将这个接口中的权限修饰符都去掉,在另一个程序中拷贝这个aidl文
件,然后放到同一个包名中,由于Android中通过包名来区分应用程序,这两个
aidl的包名一样,系统会认为两个程序中的接口是同一个,这样就能够在另一
个程序中将参数强转成这个接口,在使用aidl文件拷贝到自己的工程之后会自动
生成一个接口类,这个接口类中有 一个内部类Stub该类继承了Binder并实现了
这个接口,所以我们在自定义 IBinder的实现类时只需让自定义的类继承Stub类
即可.

  1. 远程服务中定义一个接口,改成aidl

    package com.seal.test.service;
    
    interface IService {
         void callMethodInService();
    }
  2. 远程服务中定义一个Ibinder的实现类,让这个实现类继承上面接口的Stub类,
    并在onBind方法中返回这个自定义类对象

    public class RemoteService extends Service {
        @Override
        public IBinder onBind(Intent intent) {
            System.out.println("远程服务被绑定");
            return new MyBinder();
        }
        private class MyBinder extends IService.Stub{
            @Override
            public void callMethodInService() {
                methodInService();
            }
        }
        public void methodInService(){
            System.out.println("我是远程服务里面的方法");
        }
    }
  3. 在其他程序中想要绑定这个服务并且调用这个服务中的方法的时候首先要拷贝
    这个aidl文件到自己的工程,然后再ServiceConnection的实现类中将这个参数使
    用asInterface方法转成接口,通过这样来得到接口,从而调用接口中的方法

    public class CallRemoteActivity extends Activity {
        private Intent service;
        private IService iService;
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            service = new Intent();
            service.setAction("com.itheima.xxxx");
        }
        public void bind(View veiw){
            bindService(service, new MyConn(), BIND_AUTO_CREATE);
        }
        public void call(View view){
            try {
                iService.callMethodInService();
            } catch (RemoteException e) {
                e.printStackTrace();
            }
        }
        private class MyConn implements ServiceConnection{
            @Override
            public void onServiceConnected(ComponentName name, IBinder service) {
                iService = IService.Stub.asInterface(service);
            }
            @Override
            public void onServiceDisconnected(ComponentName name) {
                // TODO Auto-generated method stub
            }
        }
    }

最后说一下IntentService:

IntentService是Service的子类,用来处理异步请求。客户端可以通过startService(Intent)方法将请求的Intent传递请求给IntentService,
IntentService会将该Intent加入到队列中,然后对每一个Intent开启一个worker thread来进行处理,执行完所有的工作之后自动停止Service。
每一个请求都会在一个单独的worker thread中处理,不会阻塞应用程序的主线程。IntentService 实际上是Looper、Handler、Service 的集合体,
他不仅有服务的功能,还有处理和循环消息的功能.

  • Service:
    1. A Service is not a separate process. The Service object itself does not imply it is running in its own process; unless otherwise specified,
      it runs in the same process as the application it is part of.
    2. A Service is not a thread. It is not a means itself to do work off of the main thread (to avoid Application Not Responding errors).
      所以在Service中进行耗时的操作时必须要新开一个线程。

至于为什么要使用Service而不是Thread,这个主要的区别就是生命周期不同,Service是Android系统的一个组件,Android系统会尽量保持Service的长期后台运行,
即使内存不足杀死了该服务(很少会出现内存不足杀死服务的情况)也会在内存可用的时候去复活该服务,而Thread随后都会被杀死
- IntentService
1. IntentService is a base class for Services that handle asynchronous requests (expressed as Intents) on demand.
Clients send requests throughstartService(Intent) calls;
the service is started as needed, handles each Intent in turn using a worker thread, and stops itself when it runs out of work.
2. This “work queue processor” pattern is commonly used to offload tasks from an application’s main thread.
The IntentService class exists to simplify this pattern and take care of the mechanics.
To use it, extend IntentService and implement onHandleIntent(Intent). IntentService will receive the Intents, launch a worker thread,
and stop the service as appropriate.
3. All requests are handled on a single worker thread – they may take as long as necessary (and will not block the application’s main loop),
but only one request will be processed at a time.


  • 邮箱 :charon.chui@gmail.com
  • Good Luck!
Charon 0.6 代理服务器 检测 ,代理服务器 扫描 judge 立即下载

相关推荐

Go-Charon-授权和身份验证服务

Charon - 授权和身份验证服务

charon异常死锁无法正常结束进程

解决 charon 进程占用端口问题的总结和步骤,以便下次遇到类似问题时快速处理:

逗老师的博客 1039

Petalinux-2018.3添加内核驱动(linux-xlnx源码打补丁)

大部分模块可以直接使用,需要添加自己的驱动文件时,可以通过linux-xlnx源码打补丁方式和使用PetaLinux编译为.ko文件加载运行,本文章介绍通过linux-xlnx源码打补丁方式添加内核驱动文件。根据查找资料,了解到可以通过打补丁方式添加到工程文件中。. /opt/tool-pkg/petalinux/2018.3/components/yocto/source/arm/layers/core/oe-init-build-env (该执行文件在Petalinux软件安装路径下)

sanyuedtaifen的博客 1556

大数据入门之hadoop集群搭建(CentOS 7)

hadoop集群搭建 安装系统 在VMware下创建新的虚拟机 这里需要和自己电脑匹配 可以从资源监视器中看到自己的cpu数量,由于需要4台虚拟机,所以这里用4个处理器内核用于一台虚拟机中 这里的内存也与自己电脑的实际情况匹配 由于桥接网络麻烦,因此这里用网络地址转换 这里的磁盘大小是在使用时具体用多少是多少,并不是从自己电脑的实际磁盘大小取出 2. 运行此虚拟机 3. 进行配置 这里涉及的linux磁盘分区的知识,想要了解的可百度查找 在这里设置r

weixin_50669884的博客 1188

海康AI开放平台实战:从数据集标注到摄像头部署的全流程避坑指南

本文是一份基于实战经验的海康AI开放平台全流程避坑指南。文章详细拆解了从数据集标注、模型训练优化到边缘摄像头部署的关键步骤,重点剖析了数据准备、参数调优、模型测试及SDK集成中的常见陷阱与解决方案,旨在帮助开发者高效、稳定地将AI算法落地于实际监控场景。

weixin_29103191的博客 697

ZYNQ学习:PL端DDR3 读写测试

DDR SDRAM 的最大特点是双沿触发,即在时钟的上升沿和下降沿都能进行数据采集和发送,同样的工作时钟, DDR SDRAM 的读写速度可以比传统的 SDRAM 快一倍。本次实验使用的 DDR3 芯片是南亚的 NT5CC256M16ER-EKI, NT5CC256M16ER-EKI 的 bank 位宽为 3,行位宽为 15,列位宽为 10,所以它的地址大小等于 2^3*2^15*2^10(即 2^28=256M),数据位宽为 16bit,所以容量大小为 256M*16bit,也就是 512MByte。

shuidiQAQ的博客 3035

【Android】安卓四大组件之Service

【Android】安卓四大组件之Service 1、Service的介绍 1.1 什么是service Service即服务,用大白话讲就是——长期运行在后台的程序,如果我们说的官方一点,那么就是用于执行长期运行的任务,并且没有与用户交互的功能。 每一个service都和activity一样,需要在manifest.xml中配置,赋予其生命。使用<service>标签即可配置 在activity类中,可以使用Context.startService()方法来开启服务,使用Context.stop

woodwhale的博客 691

从入门到实战:rkhunter(Rootkit猎手)在Linux服务器安全运维中的部署与自动化监控

本文详细介绍了rkhunter(Rootkit猎手)在Linux服务器安全运维中的部署与自动化监控方法。从Rootkit的危害性入手,讲解了rkhunter的安装、配置及实战应用,包括如何建立基准、优化定时任务方案以及智能告警处理。通过多级过滤脚本和系统级联动,帮助运维人员高效识别和应对Rootkit威胁,提升服务器安全性。

weixin_28715953的博客 242

android四大组件(Activity,Service,BroadcastReceiver,Content Provider)

安卓的四大组建,五大布局Android四大组件:Activity、Service、Broadcast Receiver、Content Provider。1、 Activity 可以去本人博客activity了解学习是Android程序与用户交互的窗口,从视觉效果来看,一个Activity占据当前的窗口,响应所有窗口事件,具备有控件,菜单等界面元素。从内部逻辑来看,Activity需要为了保持各个

Mr_haimeng的博客 1358

东方财富 vs 新浪 vs AKShare:3 种股票实时数据接口性能与稳定性实测对比

本文深度评测了东方财富、新浪和AKShare三种股票实时数据接口的性能与稳定性。通过实际测试数据,从延迟、成功率和数据完整性三个维度进行全面对比,为量化交易和数据分析开发者提供选型参考。结果显示,东方财富接口在实时性和稳定性方面表现最优,适合高频交易场景。

weixin_30800807的博客 397

SPSS&Mplus—共同方法偏差(Common Method Bias)控制与检验

共同方法偏差(Common Method Bias)的控制方法:程序控制(Procedural)和统计控制(Statistical)。

m0_54401011的博客 1万+

【Android】安卓四大组件之服务(Service)详解:从基础到进阶

Service作为安卓应用后台任务处理的核心组件,在保障应用功能完整性和提升用户体验方面起着不可或缺的作用。通过掌握Service的生命周期、分类及使用场景,开发者能够合理设计应用架构,实现高效、稳定的后台任务处理。随着安卓系统的不断升级,Service的使用也需与时俱进,结合新特性和替代方案,让应用在后台运行中发挥更大价值。希望本文能帮助大家深入理解Service,在安卓开发中灵活运用这一强大工具

m0_59734531的博客 1524

三种方式实现电脑端同时登陆多个微信

现在越来越人都有两个甚至多个微信号,有时候我们需要登录在电脑回复消息,那么怎样才能在一个电脑上同时登录两个微信甚至是多个微信号(微信多开)呢?希望下列三种方法能对各位博友有帮助。 方法一:微信网页版实现 我们知道,目前网页版微信还是可以使用的。所以,我们可以利用多个浏览器来实现在同一台电脑上登录两个或多个微信的目的。 1.首先,我们在浏览器的搜索栏输入“微信网页版”,点击搜索并点开搜索到的带“官网”标志的链接进入网页版微信。 2.打开另外一个浏览器,比如刚才打开的是自己安装的第三方浏览器,那么我们再打开W

清平乐的技术专栏 1万+

【Android】安卓四大组件之Service用法

使用Handler更新UI,基本特点后台执行Service主要用于在后台执行一些长时间运行的操作,比如音乐播放、文件下载等,而不会影响用户界面的交互。

Patrick_yuxuan的博客 1401

解决:请求的资源[/xxx/]不可用 描述 源服务器未能找到目标资源的表示或者是不愿公开一个已经存在的资源表示。

解决:请求的资源[/xxx/]不可用 描述 源服务器未能找到目标资源的表示或者是不愿公开一个已经存在的资源表示。

念兮为美 1万+

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

安卓四大组件之service

Service作为Android四大组件之一,在每一个应用程序中都扮演着非常重要的角色,所以每一位安卓工程师对其掌握是必然的!针对Service,优快云博客之星–郭霖写了两篇比较完整的解析博客: Android Service完全解析,关于服务你所需知道的一切(上) Android Service完全解析,关于服务你所需知道的一切(下)

探路的淮--Ontheway的博客 953

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

android四大组件应用app,安卓四大组件———Service

1.什么是Service(服务)Service是一种后台运行的应用组件。2.Service有哪些应用场景下载任务,qq消息缓存,音乐播放器的播放3.startService方式启动Service怎么做()首先新建一个类继承Service ,实现它的onBind方法,其中可以用onCreate(),onStartCommand()和onDestroy()方法。例如package com.exampl...

weixin_30395941的博客 513

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

安卓开发四大组件及Service

对于activity和服务来说,它指明了请求的操作名称以及作为操作对象的数据的URI和其他一些信息。比方说,它能够承载对一个activity 的请求,让它为用户显示一张图片,或者让用户编辑一些文本。广播i接收器没有用户界面,但可以启动一个activity或service来响应收到的信息,或用NotificationManager来通知用户。静态注册无需担忧是否被关闭,只要设备是开启状态,广播接收器也是打开的。使用URI唯一标识其数据集,这里的URI以content://作为前缀,表示数据由其管理。

gfdr5的博客 297

安卓四大组件之Service

Service作为安卓四大组件之一通常用来完成一些不需要用户操作,但是一直运行着的任务  在介绍Service之前 我们先了解一下安卓中进程的优先级: 安卓中的优先级共有5个 1.Foregrounf process 前台进程  当前进程中有Activity处于可见可操作(Activity执行onResume之后) service 以及广播接收者 执行生命周期方法 2.vi

ybx007的博客 512

Android 四大组件之Service

Service是android系统中的四大组件之一(Activity、Service、BroadcastReceiver、ContentProvider),它跟Activity的级别差不多,区别是Service只能运行在后台不提供用户界面,并且可以和其他组件进行交互。一个Service是一个可以长期运行在后台的应用程序组件,不提供用户界面。 另一个应用程序组件可以启动一个服务,它将继续在后台运行,...

ZHS_Vistor的博客 475

Android——四大组件Service

文章目录AndroidAndroid四大组件——Service1 简介2 生命周期3 Service分类3.1 started(启动服务)3.2 bound(绑定服务)IBinder接口ServiceConnection接口 Android Android四大组件——Service service用于在后台完成用户指定的操作。 startService() 与 bindService()区别: (a)started service(启动服务)是由其他组件调用startService()方法启动的,这导致服

weixin_45044097的博客 300

安卓四大组件 —— Service

1、什么是service? service是android四大组件之一,是可以在后台长期执行并且没有用户界面的程序组件;只能运行在主线程中,不能做耗时操作,可以跨程序调用。 2、service有哪些应用场景? 当程序中的某项功能执行时间较长(如:下载,上传等)并且在执行过程中不需要用户操作,不需要Activity进行交互的情况下,可以通过service在后台完成指定任务。 3、starSe...

s15770702468的博客 728
上一篇: Android四大组件之ContentProvider
下一篇: Bitmap优化
CharonChui
博客等级 码龄12年 66粉丝 134原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值