安卓开发基础篇——Anroid四大组件之Service

Anroid——Android Service 学习 Android开发的过程中,每次调用startService(Intent)的时候,都会调用该Service对象的onStartCommand(Intent,int,int)方法,然后在onStartCommand方法中做一些处理。 我们注意到这个函数有一个int的返回值,那就来简单地讲讲int返回值的作用。 从Android官方文档中,我们知道onStartComma 阅读详情

安卓开发四大组件之一——Service,可以理解为幕后工作者,音乐词曲作家,哈哈。那么在开发中,音乐播放,下载文件,上载文件都用到service。
Service,分为本地服务和远程服务,区分是客户端和服务端是否在同一进程当中,在为本地服务,不在为远程服务,下面着重介绍本地服务,是安卓开发中最常用到的。
启动服务有两种方式,startService和bindService;
结束服务有两种方式,startService对应stopService或stopSelf,bindService对应unBindService;
startService和bindService;——两者之间的区别:startService启动服务后,客户端和服务端再就没有联系了,也就是之间没有通信,要结束服务,要不在启动服务的地方调用stopService或者在服务中调用stopSelf;bindService启动服务后,服务和客户端是有交互的,他们之间是通过binder对象进行交互的,要结束服务,在客户端调用unBindService,bindService在开发中是最常用的,所以着重要讲解。

切记在使用service时,一定要在AndroidManifest.xml中进行配置,如何配置,Activity怎么配置,服务就怎么配置。例如项目中下载视频服务的配置

  <!-- 下载视频服务器 -->
        <service android:name="com.suowei.appsuowei.service.UpVideoService"/>


1、startService:

生命周期:

onCreate ---> onStart ---> onDestory(Android 2.0以下版本中使用)

onCreate ---> onStartCommand ---> onDestory(Android2.0以上版本中使用)

当第一次调用startService后,先调用onCreate,再调用onStart或者onStartCommand,结束服务,调用onDestory,这里要特别注意的,如果已经启动了该服务,如果再次调用startService,那么不会调用onCreate,直接调用onStart或onStartCommand。

特别注意的是:onStartCommand方法返回一个int值,这个值有四种:

(1)START_STICKY:如果service进程被kill掉,保留service的状态为开始状态,但不保留递送的intent对象。随后系统会尝试重新创建service,由于服务状态为开始状态,所以创建服务后一定会调用onStartCommand(Intent,int,int)方法。如果在此期间没有任何启动命令被传递到service,那么参数Intent将为null。
(2)START_NOT_STICKY:“非粘性的”。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统将会把它置为started状态,系统不会自动重启该服务,直到startService(Intent intent)方法再次被调用;。
(3)START_REDELIVER_INTENT:重传Intent。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统会自动重启该服务,并将Intent的值传入。
(4)START_STICKY_COMPATIBILITY:START_STICKY的兼容版本,但不保证服务被kill后一定能重启。

2、bindService:
生命周期:
bindService时:onCreate ---> onBind
unBindService时:onUnBind ---> onDestory
现在分步讲解:
在调用bindServcie时,要传入三个参数
this.bindService(intent, conn, Context.BIND_AUTO_CREATE);	
第一个参数intent为意图,用的滚瓜烂熟了吧
Intent intent=new Intent(this,UpVideoService.class);
第二个参数conn为实现了服务链接接口(ServiceConnection)的类的对象
private class UpVideoConnection implements ServiceConnection{
		@Override
		public void onServiceConnected(ComponentName name, IBinder service) {
		}
		@Override
		public void onServiceDisconnected(ComponentName name) {}
	}
第一个方法在启动服务后链接上服务调用,第二个为断开服务链接时调用,大家注意,在第一个方法中传入了一个Ibinder接口变量,这个变量就是客户端与服务进行通信的桥梁纽带,客户端与服务端要通信,必须要拿到Service对象,才能调用Service中的公共方法,在android中的Service使用onBind的方法绑定服务时,返回一个实现IBinder接口的对象,所以在Service对象内部有一个Binder对象并返回,在这个对象中,写一个方法得到该Service,这样在上面的onServiceConnected中返回一个binder对象,用这个对象拿到Service对象,这样就可以随意调用Servcie中的公共方法了,实现了客户端有服务器端的通信
	
@Override
	public IBinder onBind(Intent intent) {
		return new VideoBinder;
	}


上面这个方法是用来返回Binder对象的


那么现在在服务里面写一个类(在这个类中写一个公共方法,getService,返回值为该服务)
public class VideoBinder extends Binder{
		public UpVideoService getService(){
			return UpVideoService.this;
		}
	}
那么现在就把这个类的对象进行返回,把null改为VideoBinder对象,
public IBinder onBind(Intent intent) {
		return new VideoBinder();}
那么这样,在客户端返回的Binder对象,调用自己的方法,就获取到了Service,接下来想怎么操作Service中的方法就看你的需要了。

3、IntentService
这家伙也得讲解下,不然学员又混淆了,首先IntentService是Service的子类,那么他就拥有Service所有的属性,既然是子类,那肯定有自己独特的好用之处了。在讲解这个IntentService之前,学员必须搞清一个问题,Service与Activity运行在不在同一个线程当中,答案是默认情况下他们都在进程的主线程中,哈哈,为了防止服务访问耗时操作或者线程阻塞,导致ANR,必须要新开线程,那么不得不在Service中编写耗时操作或者逻辑时,引入了IntentService,在intentService中,已经为你新开了一个线程,所以程序员在不必要新开线程了,而在IntentService中,只提供了一个方法
protected abstract void onHandleIntent(Intent intent);
这是一个抽象方法,要实现必须要重写了,通过查阅源代码,IntentService是通过Handler looper message的方式实现了一个多线程的操作,同时耗时操作也可以被这个线程管理和执行,同时不会产生ANR的情况。说来说去,大家记住喽,一代比一代永远强。
附上IntentService源码,有兴趣的可以看看,刚学习的不建议看,到此为止
private final class ServiceHandler extends Handler {  
    public ServiceHandler(Looper looper) {  
        super(looper);  
    }  
  
    @Override  
    public void handleMessage(Message msg) {  
        onHandleIntent((Intent)msg.obj);  
        stopSelf(msg.arg1);  
    }  
}  
  
/** 
 * Creates an IntentService.  Invoked by your subclass's constructor. 
 * 
 * @param name Used to name the worker thread, important only for debugging. 
 */  
public IntentService(String name) {  
    super();  
    mName = name;  
}  
  
/** 
 * Sets intent redelivery preferences.  Usually called from the constructor 
 * with your preferred semantics. 
 * 
 * <p>If enabled is true, 
 * {@link #onStartCommand(Intent, int, int)} will return 
 * {@link Service#START_REDELIVER_INTENT}, so if this process dies before 
 * {@link #onHandleIntent(Intent)} returns, the process will be restarted 
 * and the intent redelivered.  If multiple Intents have been sent, only 
 * the most recent one is guaranteed to be redelivered. 
 * 
 * <p>If enabled is false (the default), 
 * {@link #onStartCommand(Intent, int, int)} will return 
 * {@link Service#START_NOT_STICKY}, and if the process dies, the Intent 
 * dies along with it. 
 */  
public void setIntentRedelivery(boolean enabled) {  
    mRedelivery = enabled;  
}  
  
@Override  
public void onCreate() {  
    // TODO: It would be nice to have an option to hold a partial wakelock  
    // during processing, and to have a static startService(Context, Intent)  
    // method that would launch the service & hand off a wakelock.  
  
    super.onCreate();  
    HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");  
    thread.start();  
  
    mServiceLooper = thread.getLooper();  
    mServiceHandler = new ServiceHandler(mServiceLooper);  
}  
  
@Override  
public void onStart(Intent intent, int startId) {  
    Message msg = mServiceHandler.obtainMessage();  
    msg.arg1 = startId;  
    msg.obj = intent;  
    mServiceHandler.sendMessage(msg);  
}  


基于Android的完整网上购物系统开发项目 Android四大组件是构成应用的基本单元,它们各自承担不同的职责,并通过系统机制相互协作。理解这些组件的运行机制对于构建稳定、高效的应用至关重要。创建自定义Application类:@Override// 初始化全局资源在AndroidManifest.xml中声明:Android提供了丰富的UI控件供开发者使用,同时也支持开发者根据业务需求进行自定义控件开发。当系统控件无法满足特定需求时,开发者可以通过继承View或ViewGroup来自定义控件。 阅读详情

相关推荐

(南京观海微电子)——TCON介绍

TCON又称:逻辑板,控制板,在液晶电视里的作用和CRT中的视放板相当,但有本质的区别,逻辑板不是一个纯粹的信号放大器,它输入是LVDS格式信号,而不是RGB。逻辑板的作用是把数字板送来的LVDS或TTL图像数据信号,时钟信号进行处理移位寄存器存储将图像数据信号,时钟信号转换成屏能够识别的控制信号行列信号RSDS控制屏内的MOSFET管工作而控制液晶分子的扭曲度。目前国内主要的TCON板生产商有视显光电。传统TCON的布局主要分为以下两种:X+C分离式和X+C一体式。

m0_75095200的博客 3833

android O 32位系统报错:JNI DETECTED ERROR IN APPLICATION: use of deleted local reference

一、同样的程序我在android O 64位系统上跑没有任何问题,但是在32位系统上跑就报这个错误 问题原因是: 自己写的类中有这个构造函数: public AnWBT_BLE_Service(int service_type, long mostSiguuid, long leastSiguuid, int handle, int end_group_handle, ArrayList<AnWBT_BLE_Characteristic> characteristic) { this.s...

sui1005316018的博客 1860

VESC电调高级调参指南:电机校准与性能优化实战解析

本文详细解析了VESC电调的高级调参方法,包括电机校准与性能优化实战技巧。从基础参数设置到高级机械参数优化,再到动态性能调优,提供了全面的调参指南。特别针对电机类型、功率设置、电池参数配置等关键环节给出实用建议,帮助用户充分发挥VESC电调的性能潜力。

weixin_30772105的博客 196

Android O发生crash,提示/system/bin/linker64(备忘)

错误提示: 2010-01-01 08:24:29.913 20251-20251/com.anwsdk.service W/linker: library "libsqlite.so" ("/system/lib64/libsqlite.so") needed or dlopened by "/data/app/com.anwsdk.service-fxMKx2QTE5_p3zxuHHTxEA==/lib/arm64/libanwbtdatabase.so" is not accessible for

sui1005316018的博客 2596

【TiktokAPI】Tiktok直播API与实时互动功能开发完全指南

Tiktok直播API允许开发者创建、管理直播,并实现各种互动功能。/*** 获取Tiktok直播API访问令牌* @param {string} client_id - 应用ID* @param {string} client_secret - 应用密钥* @param {string} code - 授权码* @param {string} redirect_uri - 重定向URI* @returns {Promise<object>} 访问令牌响应*/try {}),

Mageia的专栏 3189

使用VS Code创建第一个Flutter工程

你可以使用任意文本编辑器结合命令行工具来开发Flutter应用。然而,我们推荐使用本文介绍的编辑器插件以获取更好的开发体验。这些插件提供了代码补全、代码高亮、widget辅助编辑等功能,以及为项目的运行和调试提供支持。推荐的开发工具有VS Code、Android Studio、IntelliJ。本文将重点介绍如何使用VS Code进行Flutter应用开发。

2501_91373349的博客 2126

android中文SDK--Service(一)

谢谢分享!转过去细细品读! 原文地址:android中文SDK--Service(一)作者:kangdong.yang 服务service 服务是一个应用程序的组件,运行在后台,执行一些耗时长的操作,他没有用户界面。另外的应用程序组件可以启动服务,服务一旦启动,即使

C_lts的专栏 1053

【CUT&TAG分析-加了spike in的样品】

使用 Bowtie2 或 Subread (subjunc) 来构建大肠杆菌的索引。bowtie2比对时设置参数–local, 局部比对。

weixin_57975238的博客 1397

Android开发中的Service的两种启动方式的坑

和大家熟悉的Activity组件一样,service也是Android应用开程序发中常用的组件,它和acitivy一样也有自己的生命周期,不同的是service是运行在后台的,没有同用户直接交互的界面。  service的是有两种启动方式: 第一种是通过startservice方式来启动,通过此方式来启动的service会一直运行在后台,除非调用者主动停止服务或者是系统异常杀死。 此过程对应的...

EugeneYoung的博客 4720

电源防反接保护电路全攻略实战A04

本文深入剖析了硬件设计中电源保护电路的关键技术与实战经验。文章指出,保护电路虽小但至关重要,通过对比分析二极管与MOSFET防反接方案,揭示了MOSFET在效率、温控方面的优势。针对过压保护,重点讲解了TVS二极管选型要点,强调钳位电压而非击穿电压才是保护核心。文章结合工业案例(如48V通信模块烧毁、5V系统MOSFET过热等),详细阐述了PCB布局规范、热设计路径等工程细节,并提供了USB接口ESD防护的完整选型方案。最后强调硬件设计必须考虑最坏工况,在成本与性能间找到平衡点,避免因小失大。

启芯硬件的博客 776

RK3588芯片:ALSA音频通路下HDMI与耳机自动切换的技术探索

摘要:本文详细探讨了基于RK3588芯片的HDMI与耳机自动切换方案。文章首先剖析了ALSA音频架构的核心组件与工作原理,接着介绍了RK3588芯片的硬件特性及音频处理优势。重点阐述了自动切换的实现原理,包括硬件检测机制、ALSA驱动处理逻辑和软件控制流程,并提供了详细的配置步骤。同时针对常见问题如切换异常、音频质量下降等给出了解决方案。该方案通过合理配置设备树和ALSA文件,实现了音频输出的智能切换,提升了用户体验,展现了RK3588在音频处理领域的强大性能。未来随着AI音频技术的发展,该方案在智能家居、

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 266

android组件及服务,Anroid四大组件service之本地服务的示例代码

服务是Android四大组件之一,与Activity一样,代表可执行程序。但Service不像Activity有可操作的用户界面,它是一直在后台运行。用通俗易懂点的话来说:如果某个应用要在运行时向用户呈现可操作的信息就应该选择Activity,如果不是就选择Service。Service的生命周期如下:Service只会被创建一次,也只会被销毁一次。那么,如何创建本地服务呢?实现代码如下:pack...

weixin_39628271的博客 138

【知识图谱】Neo4j基本操作及数据库文件导入(graph.db.dump)

初探Neo4j导入数据备份数据客户端操作导入csv文件指定csv文件格式使用命令行导入csv文件附录 请读者参考上篇博文 Neo4j安装教程 导入数据 若开启服务,先在终端停止 Neo4j 服务 ./neo4j stop 接下来,下载射雕三部曲的数据库文件 wget https://labfile.oss.aliyuncs.com/courses/1354/graph.db.dump 下载完将出现 graph.db.dump 文件: 将数据库文件导入到 Neo4j 中 首先进入neo4j 根目录下:

全网粉丝30W+,优快云、稀土掘金人工智能领域签约作者,人工智能、大模型、Python 爬虫,商务合作,请私信沟通。 8616

Android有四大组件:Activity、Service、Broadcast Receiver、Content Provider

在这些组件之间的通讯中,主要是由Intent协助完成的。 Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将 Intent传递给调用的组件,并完成组件的调用。 因此,Intent在这里起着一个媒体中介的作用,专门提供组件互相调用的相关信息,实现调用者与被调用者之间的解耦。 Android有四大组件:Activi...

weixin_38576356的博客 2909

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Anroid四大组件service之本地服务

服务是Android四大组件之一,与Activity一样,代表可执行程序。但Service不像Activity有可操作的用户界面,它是一直在后台运行。用通俗易懂点的话来说: 如果某个应用要在运行时向用户呈现可操作的信息就应该选择Activity,如果不是就选择Service。 Service的生命周期如下: Service只会被创建一次,也只会被销毁一次。那么...

weixin_30695195的博客 76

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Anroid中Service详解

一、android service简介 1、Android中的服务和windows中的服务是类似的东西,服务一般没有用户操作界面,它运行于系统中不容易被用户发觉,可以使用它开发如监控之类的程序。 2、在Android中,Activity主要负责前台页面的展示,Service主要负责需要长期运行的任务。例如,一个从service播放音乐的音乐播放器,应被设置为前台运行,因为用户会明确

sundongqing521的博客 680

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Android四大组件

这个文章主要是讲Android开发的四大组件,本文主要分为 一、Activity详解 二、Service详解 三、Broadcast Receiver详解 四、Content Provider详解 外加一个重要组件 intent的详解。 一、Activity详解 Activty的生命周期的也就是它所在进程的生命周期。   一个Activity的

LTFV5的博客 559

跟着API看anroid之Context——android.content.Context

接触android开发后,许多东西都要百度查阅,后来发现有点零碎,掌握的不够系统,甚至有的东西很容易遗忘。所以才有了这篇博文,或许可以说这系列博文吧(后面会慢慢整理)。适用者说明:系统了解Context,但又不想看英文API的读者。如果想快速了解Context,这篇可能不适合,还是去百度其他的吧。声明:本文主要参考API文档,及部分google翻译。1、Context概述类位置:android.c...

bendan50的博客 1万+

Anroid 4大组件之android.app.Service

android.app.Service A Service is an application component representing either an application's desire to perform a longer-running operation while not interacting with the user or to supply functi...

weixin_34355881的博客 148

android四大组件(详细总结)

Android四大组件分别为activity、service、content provider、broadcast receiver。一、android四大组件详解1、activity(1)一个Activity通常就是一个单独的屏幕(窗口)。(2)Activity之间通过Intent进行通信。(3)android应用中每一个Activity都必须要在AndroidManifest.xml配置文件中...

yinge0508的博客 244

android service给activity发广播,Android开发--Service和Activity通过广播传递消息

Android的Service也运行在主线程,但是在服务里面是没法直接调用更改UI,如果需要服务传递消息给Activity,通过广播是其中的一种方法:一、在服务里面发送广播通过intent传送数据、通过setAction 设置Activity接收广播时要过滤的动作名Intent intent = new Intent();intent.putExtra("key", "test");intent....

weixin_39624774的博客 845

Android 实现Service悬浮窗监听实时网速

安卓让Service可见的方法

m0_57487205的博客 2089

anroid 权限 cocos2dx 交叉编译 android 权限

cocos2d-x 交叉编译 app 添加权限 : Android开发应用程序时,如果应用程序需要访问网络权限,需要在 AndroidManifest.xml 中加入以下代码:   //android.permission.你要的权限 也是修改添加的权限 INTERNET 同样的如果用到其它的权限,也需要作出声明,部分权限列表如下: ACCESS_CHECKIN_PROPERTI

oawaken929的专栏 905

怎样才算精通Anroid开发?

做Anriod开发将近一年了,我究竟掌握了哪些技术,哪些工作方法? 从刚开始的SDK文档应用,我熟悉了各种组件控件的使用、布局:包括Activity、Service、Intent、BroadcastReceiver、ContentProvider以及进行线程处理的Handler等 对这些组件控件的熟悉,并不能代表我精通了Android开发。只能说,我能快速的开发一些一般...

Jasonshieh 270

anroid Remote Service 使用注意事项

在使用remote service的时候,您是否遇到过:连接远程服务时remoteService的onBind函数执行了,而您的onServiceConnected 却没有执行呢? 这是因为您在同一个线程里执行了连接操作后立即执行了其他操作,而此时remoteService还没有完成连接,说到底就是时序问题。 解决这个问题的办法是:在onServiceConnected函数执行后,再执行

Android_in_China 1368

Anroid 分析:proxy模式理解Manager和Service

Android 通过 Context提供getSystemService的接口, 而是实现类是 ContextImp ContextImpl.java 的Load时(Static),会创建一堆 service proxy 对象,而后将其放入HashMap表中, 比如StatusBarManager 当用户调用 Service 方法的时候, Proxy 对象会将其传给真正

span76的专栏 1013
上一篇: Android开发事件传递机制详解
下一篇: 安卓开发基础篇——Anroid四大组件之Broadcast Receiver
所谓简爱
博客等级 码龄11年 8粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值