96SEO 2026-02-20 06:44 0
Service是Android程序中四大基础组件之一它和Activity一样都是Context的子类只不过它没有UI界面是在后台运行的组件。

Service是Android中实现程序后台运行的解决方案它非常适用于去执行那些不需要和用户交互而且还要求长期运行的任务。
Android中的服务Service和Activity不同的是不能与用户交互的不能自己启动系统的后台运行当程序退出时我们没有显示的调用停止服务那么这个Service就没有结束它仍然在后台运行。
Service和其他组件一样都是运行在主线程中因此不能用它来做耗时的操作。
本地服务:用于应用程序内部在Service可以调用startService()启动调用stopService()结束无论调用了多少次startService()都只需调用一次stopService()来停止采用startService()方法启动服务只能调用stopService()方法结束服务服务结束时会调用onDestroy()方法,。
远程服务用于系统内部的应用程序之间可以定义接口并把接口暴露出来以便其他应用进行操作客户端建立到服务对象的连接并通过那个连接来调用服务调用bindService()方法建立连接并启动以调用unbindService()关闭连接多个客户端可以绑定至同一个服务。
Service默认并不会运行在子线程中它也不运行在一个独立的进程中它同样执行在UI线程中因此不要在Service中执行耗时的操作除非你在Service中创建了子线程来完成耗时操作。
android:name.myserviceandroid:enabledtrueandroid:exportedtrueandroid:icondrawable/background_blueandroid:labelstringandroid:processstringandroid:permissionstring/service
字段说明android:exported表示是否允许除了当前程序之外的其他程序访问这个服务android:enabled表示是否启用这个服务android:permission是权限声明android:process是否需要在单独的进程中运行,当设置为android:process”:remote”时代表Service在单独的进程中运行。
注意“”很重要它的意思是指要在当前进程名称前面附加上当前的包名所以“remote”和”:remote”不是同一个意思前者的进程名称为remote而后者的进程名称为App-packageName:remote。
android:isolatedProcess设置
意味着服务会在一个特殊的进程下运行这个进程与系统其他进程分开且没有自己的权限。
与其通信的唯一途径是通过服务的API(bind
的的生命周期会根据调用不同的方法启动有不同的表现具体有两种形式。
、onStartCommand()、onStart()(已经过时)
生命周期是这样的bindService()、onCreate()
intent)、unBindService()、onDestroy()
生命周期顺序onCreate-onStartCommand-onDestroy
系统在service第一次创建时执行此方法来执行只运行一次的初始化工作。
如果service已经运行这个方法不会被调用。
每次客户端调用startService()方法启动该Service都会回调该方法多次调用。
一旦这个方法执行service就启动并且在后台长期运行。
通过调用stopSelf()或stopService()来停止服务。
系统在service不再被使用并要销毁时调用此方法一次调用。
service应在此方法中释放资源比如线程已注册的侦听器接收器等等这是service收到的最后一个调用。
生命周期顺序onCreate-onBind-onUnBind-onDestroy
当组件调用bindService()想要绑定到service时(比如想要执行进程间通讯)系统调用此方法一次调用一旦绑定后下次再调用bindService()不会回调该方法。
在你的实现中你必须提供一个返回一个IBinder来以使客户端能够使用它与service通讯你必须总是实现这个方法但是如果你不允许绑定那么你应返回null。
当前组件调用unbindService()想要解除与service的绑定时系统调用此方法一次调用一旦解除绑定后下次再调用unbindService()会抛出异常。
注意通过bindService启动的Service的生命周期依附于启动它的Context。
完整生命周期onCreate()--onStartCommand()--onDestroy()
开启服务onCreate()--onStartCommand()
连接的时候如果有服务的对象则复用如果服务对象不存在则创建一个服务的对象
完整生命周期onCreate()--onBind()--onUnbind()--onDestroy()
start开启服务可以长期运行在后台,服务组件在自己的应用程序中
bind绑定服务可以调用服务里的方法,服务组件不在自己的应用程序中
Android中的Service是用于后台服务的当应用程序被挂到后台的时候问了保证应用某些组件仍然可以工作而引入了Service这个概念那么这里面要强调的是Service不是独立的进程也不是独立的线程它是依赖于应用程序的主线程的也就是说在更多时候不建议在Service中编写耗时的逻辑和操作否则会引起ANR。
那么我们当我们编写的耗时逻辑不得不被service来管理的时候就需要引入IntentServiceIntentService是继承Service的那么它包含了Service的全部特性当然也包含service的生命周期那么与service不同的是IntentService在执行onCreate操作的时候内部开了一个线程去你执行你的耗时操作。
2.Service不是一个线程所以我们应该避免在Service里面进行耗时的操作
IntentService:异步处理服务新开一个线程handlerThread在线程中发消息然后接受处理完成后会清理线程并且关掉服务。
1.它创建了一个独立的工作线程来处理所有的通过onStartCommand()传递给服务的intents。
2.创建了一个工作队列来逐个发送intent给onHandleIntent()。
3.不需要主动调用stopSelft()来结束服务。
因为在所有的intent被处理完后系统会自动关闭服务。
默认实现的onStartCommand()的目的是将intent插入到工作队列中
继承IntentService的类至少要实现两个函数构造函数和onHandleIntent()函数。
要覆盖IntentService的其它函数时注意要通过super调用父类的对应的函数
com.loaderman.intentservicedemo;
android.support.v7.app.AppCompatActivity;
{super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);startService(new
Intent(this,MyService.class));//主界面阻塞最终会出现Application
responding//连续两次启动IntentService会发现应用程序不会阻塞而且最重要的是第二次的请求会再第一个请求结束之后运行(这个证实了IntentService采用单独的线程每次只从队列中拿出一个请求进行处理)startService(new
Intent(this,MyIntentService.class));startService(new
Intent(this,MyIntentService.class));}
com.loaderman.intentservicedemo;import
{super.onCreate();}Overridepublic
startId);//经测试Service里面是不能进行耗时的操作的必须要手动开启一个工作线程来处理耗时操作System.out.println(onStart);try
{e.printStackTrace();}System.out.println(睡眠结束);}Overridepublic
com.loaderman.intentservicedemo;import
{super(loaderman);}Overrideprotected
经测试IntentService里面是可以进行耗时的操作的//IntentService使用队列的方式将请求的Intent加入队列然后开启一个worker
thread(线程)来处理队列中的Intent//对于异步的startService请求IntentService会处理完成一个之后再处理第二个System.out.println(onStart);try
{e.printStackTrace();}System.out.println(睡眠结束);}
在AndroidManifest.xml文件中对于intent-filter可以通过android:priority
1000这个属性设置最高优先级1000是最高值如果数字越小则优先级越低同时适用于广播。
【结论】目前看来priority这个属性貌似只适用于broadcast对于Service来说可能无效
Android中的进程是托管的当系统进程空间紧张的时候会依照优先级自动进行进程的回收
当service运行在低内存的环境时将会kill掉一些存在的进程。
因此进程的优先级将会很重要可以在startForeground()使用startForeground()将service放到前台状态。
这样在低内存时被kill的几率会低一些。
【结论】如果在极度极度低内存的压力下该service还是会被kill掉并且不一定会restart()
方式就是当service走onDestory()的时候发送一个自定义的广播当收到广播的时候重新启动service
【结论】当使用类似口口管家等第三方应用或是在setting里-应用-强制停止时APP进程可能就直接被干掉了onDestroy方法都进不来所以还是无法保证
通过系统的一些广播比如手机重启、界面唤醒、应用状态改变等等监听并捕获到然后判断我们的Service是否还存活别忘记加权限
【结论】这也能算是一种措施不过感觉监听多了会导致Service很混乱带来诸多不便
这样产生的进程,会被系统认为是两个不同的进程.但是Android5.0之后可能不行
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback