client端的startService() 我们在Application或者Activity里调用bindService()的时候,其实调用的是Context中的抽象方法: public abstract...ComponentName startService(Intent service); 复制代码 真正的是现在ContextImpl中: @Override public ComponentName...startService(Intent service) { //当system进程调用此方法时输出warn信息,system进程建立调用startServiceAsUser方法...(),一些参数,然后通过IPC调用到AMS的startService()方法。...enforceNotIsolatedCaller("startService"); // Refuse possible leaked file descriptors
Started Service中使用startService()方法来进行方法的调用,调用者和服务之间没有联系,即使调用者退出了,服务依然在进行 【onCreate()- >onStartCommand...()->startService()->onDestroy()】,注意其中没有 onStart(),主要是被onStartCommand()方法给取代了,onStart方法不推荐使用了。...MyService 77 intent.putExtra("data",edittext.getText().toString()); 78 startService...onStartCommand(Intent intent, int flags, int startId) { 33 data = intent.getStringExtra("data"); //startService
那么,什么情况下既使用startService,又使用bindService呢? 如果你只是想要启动一个后台服务长期进行某项任务,那么使用startService便可以了。...因此,这种情况就需要startService和bindService一起使用了。...对于startService来说,不管是本地服务还是远程服务,我们需要做的工作都一样简单。...startservice 我们可以通过startservice来启动一个service,启动后,service在后台运行。...然而,startservice并不能解决我们所有的需求,比如,我有时候,需要service的返回结果,我需要和service交互,startservice显然不能完成。
PC.png 基于 android9.0 场景:在 APP M 中启动 APP N 中一个服务,即目标服务和 APP M 不在同一个进程 启动流程简述 activity启动一个服务,调用 AMS.startService...(new Intent("")); } } 当前 activity 的进程标记为 A 【1.1】ContextWrapper.startService() 【ContextWrapper.java...(Intent service) { //实现类是 ContextImpl 【1.2】 return mBase.startService(service); } ...} 【1.2】ContextImpl startService() 【--->】 startServiceCommon() class ContextImpl extends Context { ... @Override public ComponentName startService(Intent service) { warnIfCallingFromSystemProcess
= null) { if (type == ActivityThread.SERVICE_DONE_EXECUTING_START) { //不会执行 //startService的onStartCommand
上面startService()和bindService()两种模式是完全独立的。你可以绑定一个已经通过startService()方法启动的服务。...例如:一个后台播放音乐服务可以通过startService(intend)对象来播放音乐。...你可以可以绑定到一个通过startService()启动的服务。如一个intent想要播放音乐,通过startService() 方法启动后台播放音乐的service。...然而,只有通过startService()方法启动service服务时才会调用onStart()方法。...也就是说: startService()方式启动,Service是通过接受Intent并且会经历onCreate()和onStart()。
如何绕过 Android 8.0 startService 限制 应用在后台运行时,会消耗一部分有限的设备资源,例如 RAM。...(ContextImpl.java:1532) at android.content.ContextWrapper.startService(ContextWrapper.java:664)...条件成立, 继续看 AMS startService 方法中是如何返回这个 ComponentName 的: public ComponentName startService(IApplicationThread...别忘了标题,最终想要实现的是绕过 Android 8.0 startService 的限制,即不修改为前台服务,调用 startService 方法,仍旧可以启动属于后台应用的后台服务,怎么实现呢?...8.0 startService 的限制,也是可行的。
,第一:什么状态下startService的属于后台启动service;第二:如果想要在后台startService,如何兼容,因此分如下几个问题分析下 后台startService的场景 后台startService...的Crash原理分析 如何修改达到兼容 对于普通APP而言,我们不考虑系统的各种白名单,一般后台startService服务分下面两种: 通过其他应用startService 通过自己应用startService...而每种又可以分不同的小场景,通过其他应用startService已经不被推荐,所以先看看自己应用startService。...本文基于Android P源码 通过自己应用在后台startService限制 可以通过一个简单的实验观察什么情况属于后台startService,注意:如果是自己APP启动Service,那么自身应用必定已经起来了...; 通过其他应用startService的情况 跨应用startService已经不被推荐了,不过也容易模拟,在A应用中通过setAction+setPackage就可以startService:
ExecutorService接口继承了Executor接口,定义了一些生命周期的方法
使用startService()方法启用服务,调用者与服务之间没有关连,即使调用者退出了,服 务仍然运行。...如果打算采用startService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法,接着调用onStartCommand()方法。...如果调用startService()方法前服务已经被创建,多次调用startService()方法并不会导致多次创建服务,但会导致多次调用onStartCommand()方法。...采用startService()方法启动的服务,只能调用stopService()方法结束服务,服务结束时会调用onDestroy()方法。...说明应该会有一种方法来接收bindService传过来的intent参数(不是onBind,它只会调用一次) 代码在这里: startService bindService
(CameraService.class); mSystemServiceManager.startService(ACCOUNT_SERVICE_CLASS); mSystemServiceManager.startService...mSystemServiceManager.startService(BluetoothService.class); ........mSystemServiceManager.startService(MetricsLoggerService.class); mSystemServiceManager.startService...mSystemServiceManager.startService(SoundTriggerService.class); if (!...mSystemServiceManager.startService(ShortcutService.Lifecycle.class); mSystemServiceManager.startService
主要涉及的方法有 startService: 通过反射创建相关服务,并且调用对应服务的onStart()方法来开启服务 startBootPhase: 开启特殊的启动阶段节点,各项服务会根据不同的阶段节点执行不同的逻辑...); // 启动ActivityManagerService mActivityManagerService = mSystemServiceManager.startService(...RollbackManagerService.class); // 启动BugreportManagerService, 捕获bug的报告 mSystemServiceManager.startService...(ACCOUNT_SERVICE_CLASS); mSystemServiceManager.startService(CONTENT_SERVICE_CLASS);...mSystemServiceManager.startService(new AlarmManagerService(context)); // 闹钟服务 ...
通过 startService(Intent intent) 启动 Service 生命周期是这样的: onCreate() 、onStartCommand()、onStart()(已经过时) 、onDestroy...通过 startService 启动 前面说了,通过 startService() 启动 Service 会执行 onCreate()、onStartCommand()、onDestroy() 方法。...注意:当调用 startService(Intent intent) 后,之后只执行一次 onCreate() 方法,反复多次调用 startService 后,Service 只会重复执行 onStartCommandonStart...(放到下一篇吧) 关于 Service 启动总结 上面介绍的都是在单独执行 startService 或者 binService 的情况下。...无论你在哪个 Activity 内再调用 startService 效果就和上面分析的多次调用 Service 效果是一样的。
生命周期常用方法 在Service的生命周期里,常用的有: 4个手动调用的方法 手动调用方法 作用 startService() 启动服务 stopService() 关闭服务 bindService(...2.1 startService() 作用:启动Service服务 手动调用startService()后,自动调用内部方法:onCreate()、onStartCommand() 调用逻辑如下:...常见的生命周期使用 3.1 只使用startService启动服务的生命周期 ? 3.2 只使用BindService绑定服务的生命周期 ?...3.3 同时使用startService()启动服务、BindService()绑定服务的生命周期 ?...Service startService开启的Service,调用者退出后Service仍然存在; BindService开启的Service,调用者退出后,Service随着调用者销毁。
Activity可以通过startService和bindService启动Service。.... */ 通过startService()这种方式启动的service,生命周期是这样: 调用startService() → onCreate()→ onStartCommand()→ onDestroy...() 这种方式启动的话,需要注意一下几个问题,第一:当我们通过startService被调用以后,多次在调用startService(),onCreate()方法也只会被调用一次,而onStartConmon...Service的2种启动方式 第一种启动方式: 通过 start 方式开启服务,即 startService(启动)。...started(启动):当应用程序组件(如 activity)调用 startService() 方法启动服务时,服务处于 started 状态。
Service startService 方法源码分析 在Activity调用startService方法实质调用的是ContextWrapper中的startService方法。...而这个方法调用的是Context的public abstract ComponentName startService(Intent service);方法,由于ContextImpl是Context的具体实现类...,Context的大部分操作都是通过ContextImpl来实现的,所以这里的startService方法就是调用的ContextImpl中的startService方法。...@Override public ComponentName startService(Intent service) { warnIfCallingFromSystemProcess...,由于ActivityManager.getService()就ActivityManagerService对象,所以调用的就是ActivityManagerService的startService方法
Service类 需重写父类的onCreate()、onStartCommand()、onDestroy()和onBind()方法 步骤2:构建用于启动Service的Intent对象 步骤3:调用startService...= (Button) findViewById(R.id.startService); stopService = (Button) findViewById(R.id.stopService...); startService.setOnClickListener(this); startService.setOnClickListener(this);...()方法-传入Intent对象,以此启动服务 startService(startIntent); //点击停止...()方法-传入Intent对象,以此启动服务 startService(startIntent); break;
Service类 需重写父类的onCreate()、onStartCommand()、onDestroy()和onBind()方法 步骤2:构建用于启动Service的Intent对象 步骤3:调用startService...= (Button) findViewById(R.id.startService); stopService = (Button) findViewById(R.id.stopService...); startService.setOnClickListener(this); startService.setOnClickListener(this);...= (Button) findViewById(R.id.startService); stopService = (Button) findViewById(R.id.stopService...()方法-传入Intent对象,以此启动服务 startService(startIntent); break;
不论调用了多少次startService()方法,你只需要调用一次stopService()来停止服务。...使用startService()方法启用服务,调用者与服务之间没有关连,即使调用者退出了,服务仍然运行。...如果调用startService()方法前服务已经被创建,多次调用startService()方法并不会导致多次创建服务,但会导致多次调用onStart()方法。...运行时可以发现第一次startService时,会调用onCreate和onStart,在没有stopService前,无论点击多少次startService,都只会调用onStart。...而onBind在startService/stopService中没有调用。
在startService方法中会调用mBase的startService方法,Context类型的mBase对象具体指的是什么呢?...那么,我们紧接着来查看ContextImpl的startService方法,代码如下所示。...ActivityManagerProxy(AMP)的startService方法,最终会调用AMS的startService方法。...至于注释1处的代码为何会调用AMS的startService方法,在Android深入四大组件(一)应用程序启动过程这篇文章中已经讲过,这里不再赘述。...2.ActivityThread启动Service 我们接着来查看AMS的startService方法。
领取专属 10元无门槛券
手把手带您无忧上云