当前位置:首页 » 安卓系统 » android服务应用

android服务应用

发布时间: 2023-04-26 09:45:17

A. 安卓应用里游戏服务是什么

安卓应用里轿游毁游戏服务是指安卓应用里游戏所提供的服务,它可以让用户在游戏中获得更好的体闭备验,比如游戏更新、在线游戏、游磨颤戏联机等等。

B. android服务是什么软件

Android服务Service是android系统中的一种组件,安卓不同版本图片它跟Activity的级别差不多,但是他不能自己运行,只能后台运行,并且可以和烂源纳其他组件进行交互!

服务( Service )是 Android 中实现程序后台运行的解决方案,它非常适合用于去执行那些不需要和用户交互而且还要求长期运行的任务。服务的运行不依赖于任何用户界面,即使当程序被切换到后台,或者用户打开了另外一个应用程序,服务仍然能够保持正常运行。

不过需要注意的是,服务并不是运行在一个独立的进程当中的,而是依赖于创建服务时所在的应用程序进程。当某个裂悄应用程序进程被杀掉时,所有依赖于该进程的服务也会停止运行。

另外,也不要被服务的后台概念所迷惑,实际上服务并不会自动开启线程,所有的代码都是默认运行在主线程当中的。也就是饥没说,我们需要在服务的内部手动创建子线程,并在这里执行具体的任务,否则就有可能出现主线程被阻塞住的情况!

况。

C. Android应用程序启动流程总结

AMS主要功能:
AMS是Android中最核心的服务,主要负责系统中四大组件的启动、切换、调度及应用进程的管理和调度等工作。还负责启动或杀死应用程序的进程。

WMS主要功能:
为所有窗口分配Surface。
管理Surface的显示顺序、尺寸、位置。
管理窗口动画。
输入系统相关:WMS是派发系统按键和触摸消息的最佳人选,当接收到一个触摸事件,它需要寻找一个最合适的窗口来处理消息。

PWS主要功能:
PMS 用来管理跟踪所有应用APK,包括安装,卸载,解析,控制权限等。

SystemServer也是一个进程,包括AMS、PMS、WMS等等。

zygote意为“受精卵“。Android是基于Linux系统的,而在Linux中,所有的进程都是由init进程直接或者是间接fork出来的,zygote进程也不例外。

App进程是用户点击桌面icon时,通过Launcher进程请求SystemServer,再调用Zygote孵化的。

①点击启动一个App,Launcher进程采用Binder IPC向ActivityManagerService发起startActivity请求;

②ActivityManagerService接收到请求后,向zygote进程发送创建进程的请求;

③Zygote进程fork出新的子进程,即App进程;

④App进程通过Binder IPC向sytem_server进程发起绑定Application请求;

⑤system_server进程在收到请求后,进行一系列准备工作后,再通过binder IPC向App进程发送scheleLaunchActivity请求;

⑥App进程的binder线程(ApplicationThread)在收到请求后,通过handler向主线程发送LAUNCH_ACTIVITY消息;

⑦主线程在收到Message后,通过发射机制创建目标Activity,并回调Activity.onCreate()等方法。

⑧到此,App便正式启动,开始进入Activity生命周期,执行完onCreate/onStart/onResume方法,UI渲染结束后便可以看到App的主界面。

备注:
Launcher,PMS,Zygote,App进程是三个独立的进程,相互通信就需要使用进程间通信机制。与Zygote通信是使用的socket通信,Launcher,PMS,App进程间使用的是Binder机制。

D. 好用的安卓应用市场推荐几个

1、应用宝:是腾讯应用中心专为智能手机用户打造的一个手机应用获取平台,可在应用搜索方面推出“唯一”搜索,可有效帮助用户解决下应用下载中误下载山寨应用的问题,安全、放心的下载应用;

2、豌豆荚:是一款在PC上使用的Android手机管理软件,把手机和电脑连接上后,即可以将各类应用程序、音乐、视频、电子书等内容传输或者从网络直接下载到手机上,也可以用它实现备份、联系人管理、短信群发、截屏等功能;

3、安卓市场:是中国国内的安卓软件和游戏下载平台,为用户提供良好的手机软件服务;

4、应用汇:是国内一家承诺对用户进行第三方赔付的Android应用商店;

5、安智市场:是目前中国最知名的Android系统手机应用软件免费下载平台。

E. android 五大应用开发框架是什么

android应用开发框架是 Application Framework,其系统架构由5部分组成,分别是:Linux Kernel、Android Runtime、Libraries、Application Framework、Applications。

1、Linux Kernel (Linux内核)

Android基于Linux 2.6提供核心系统服务,例如:安全、内存管理、进程管理、网络 堆栈、驱动模型。Linux Kernel也作为硬件和软件之间的抽象层,它隐藏具体硬件细节而为上层提供统一的服务。

2、Android Runtime (运行库)

Android包含一个核心库的集合,提供大部分在java编程语言核心类库中可用的功能。每一个Android应用程序是Dalvik虚拟机中的实例,运行在他们自己的进程中。

Dalvik虚拟机设计成,在一个设备可以高效地运行多个虚拟机。Dalvik虚拟机可执行文件格式是.dex,dex格式是专为Dalvik设计的一种压缩格式,适合内存和处理器速度有限的系统。 大多数虚拟机包括JVM都是基于栈的,而Dalvik虚拟机则是基于寄存器的。

3、Libraries (程序库)

Android包含一个C/C++库的集合,供Android系统的各个组件使用。这些功能通过Android的应用程序框架(application framework)暴露给开发者。

4、Application Framework (应用框架层)

通过提供开放的开发平台,Android使开发者能够编制极其丰富和新颖的应用程序。开发者可以自由地利用设备硬件优势、访问位置信息、运行后台服务、设置闹钟、向状态栏添加通知等等,很多很多。 开发者可以完全使用核心应用程序所使用的框架APIs。

应用程序的体系结构旨在简化组件的重用,任何应用程序都能发布他的功能且任何其他应用程序可以使用这些功能(需要服从框架执行的安全限制)。这一机制允许用户替换组件。

5、Applications(应用层)

Android装配一个核心应用程序集合,包括电子邮件客户端、SMS程序、日历、地图、浏览器、联系人和其他设置。所有应用程序都是用Java编程语言写的。Android本身是一套软件堆迭(Software Stack),或称为“软件迭层架构”,迭层主要分成三层:操作系统、中间件、应用程序。

(5)android服务应用扩展阅读

开发人员也可以完全访问核心应用程序所使用的API框架。该应用程序的架构设计简化了组件的重用;任何一个应用程序都可以发布它的功能块并且任何其它的应用程序都可以使用其所发布的功能块(不过得遵循框架的安全性限制)。同样,该应用程序重用机制也使用户可以方便的替换程序组件。

隐藏在每个应用后面的是一系列的服务和系统,其中包括;

丰富而又可扩展的视图(Views),可以用来构建应用程序,它包括列表(lists),网格(grids),文本框(textBoxes),按钮(buttons),甚至可嵌入的web浏览器。

内容提供器(ContentProviders)使得应用程序可以访问另一个应用程序的数据(如联系人数据库),或者共享它们自己的数据

资源管理器(ResourceManager)提供非代码资源的访问,如本地字符串,图形,和布局文件(layoutfiles)。

通知管理器(NotificationManager)使得应用程序可以在状态栏中显示自定义的提示信息。

活动管理器(ActivityManager)用来管理应用程序生命周期并提供常用的导航回退功能。

F. 如何给Android应用创建本地服务

本文通过代码向大家详细介绍和演示这两种的服务的创建过程,代码适用于Android2.3.3以后的版本。


1. 定义清单文件(AndroidManifest.xml)

4. 创建服务启动界面(LocalServiceActivities.java)

package my.android.test;

import android.app.Activity;

import android.content.ComponentName;

import android.content.Context;

import android.content.Intent;

import android.content.ServiceConnection;

import android.os.Bundle;

import android.os.IBinder;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.Toast;

/**

* 该类中包含两种类型服务的客户端:

* 启动类型服务客户端:Controller

* 绑定类型服务客户端:Binding

*/

publicclass LocalServiceActivities {

/**

* Controller类是启动类型服务的客户端,它包含两个按钮:

* start:点击该按钮时,启动服务。

* stop: 点击该按钮时,终止服务。

*/

publicstaticclass Controller extends Activity{

/**

* Activity被首次启动时,调用该方法。

*/

@Override

protectedvoid onCreate(Bundle savedInstanceState){

super.onCreate(savedInstanceState);

//填充布局

setContentView(R.layout.local_service_controller);

//查找布局中的启动服务按钮,并设置点击事件监听器。

Button button = (Button)findViewById(R.id.start);

button.setOnClickListener(mStartListener);

//查找布局中的终止服务按钮,并设置点击事件监听器。

button = (Button)findViewById(R.id.stop);

button.setOnClickListener(mStopListener);

}

/**

* start按钮的点击事件监听器实现。

*/

private OnClickListener mStartListener = new OnClickListener(){

publicvoid onClick(View v){

//启动LocalService服务。

startService(new Intent(Controller.this, LocalService.class));

}

};

/**

* stop按钮的点击事件监听器实现。

*/

private OnClickListener mStopListener = new OnClickListener(){

publicvoid onClick(View v){

//终止LocalService服务。

stopService(new Intent(Controller.this, LocalService.class));

}

};

}

/***************************************************************

*以下是绑定型服务客户端的实现

***************************************************************/

/**

* Binding类是绑定类型服务的客户端,它包含两个按钮:

* bind:点击该按钮时,调用bindService()方法绑定并启动服务;

* unbind:点击该按钮时,调用unbindService()方法解除绑定并终止服务。

*/

publicstaticclass Binding extends Activity{

//用于保存服务的绑定状态,true:绑定,false:未绑定

privatebooleanmIsBound;

//用于保存被绑定的本地服务实例。

private LocalService mBoundService;

/**

* 实现监视被绑定服务状态的接口:ServiceConnection

* 绑定类型服务都要实现这个接口,以便监视服务的状态,这个接口中的方法会在

* 应用的主线程中被调用。

*/

private ServiceConnection mConnection = new ServiceConnection(){

/**

* 当连接的服务被创建时,Android系统会调用这个方法,用IBinder对象跟服务建立通信通道。

* @param className:被连接的具体的服务组件的名称

* @param service:服务的通信通道IBinder对象。

*/

publicvoid onServiceConnected(ComponentName className, IBinder service){

//从IBinder对象中获取服务实例。

mBoundService = ((LocalService.LocalBinder)service).getService();

//显示Activity已经与服务建立了连接的提示消息。

Toast.makeText(Binding.this, R.string.local_service_connected, Toast.LENGTH_SHORT).show();

}

/**

* 当服务被终止时,Android系统会调用这个方法。

*/

publicvoid onServiceDisconnected(ComponentName className){

//清除客户端服务实例

mBoundService = null;

//显示服务被终止的提示消息。

Toast.makeText(Binding.this, R.string.local_service_disconnected, Toast.LENGTH_SHORT).show();

}

};

/**

* 绑定并启动服务,bind按钮点击时会调用这个方法。

*/

void doBindService(){

//绑定并启动服务。

bindService(new Intent(Binding.this, LocalService.class), mConnection, Context.BIND_AUTO_CREATE);

mIsBound = true;

}

/**

* 解除与服务的绑定,unbind按钮被点击时会调用这个方法

*/

void doUnbindService(){

//如果服务被绑定,则解除与服务绑定。

if(mIsBound){

unbindService(mConnection);

mIsBound = false;

}

}

/**

* 当Activity被销毁时,调用解除绑定服务的方法,解除被绑定的服务。

*/

@Override

protectedvoid onDestroy(){

super.onDestroy();

//解除被绑定的服务。

doUnbindService();

}

/**

* bind按钮的点击事件监听器接口实现。

*/

private OnClickListener mBindListener = new OnClickListener(){

publicvoid onClick(View v){

//绑定并启动服务。

doBindService();

}

};

/**

* unbind按钮的点击事件监听器接口实现。

*/

private OnClickListener mUnbindListener = new OnClickListener(){

publicvoid onClick(View v){

//解除被绑定的服务。

doUnbindService();

}

};

/**

* Activity被首次启动时,会调用这个方法。

*/

@Override

protectedvoid onCreate(Bundle savedInstanceState){

super.onCreate(savedInstanceState);

//填充Activity

setContentView(R.layout.local_service_binding);

//查找布局中的bind按钮,并设置点击事件的监听器

Button button = (Button)findViewById(R.id.bind);

button.setOnClickListener(mBindListener);

//查找布局中的unbind按钮,并设置点击事件的监听器

button = (Button)findViewById(R.id.unbind);

button.setOnClickListener(mUnbindListener);

}

}

}

5. 创建服务(LocalService.java)

package my.android.test;

import android.app.Service;

import android.content.Intent;

import android.os.Binder;

import android.os.HandlerThread;

import android.os.IBinder;

import android.os.Handler;

import android.os.Looper;

import android.os.Message;

import android.os.Process;

import android.util.Log;

import android.widget.Toast;

/**

* LocalService基础Android的Service类,实现应用的本地服务组件。

* 该服务使用HandlerThread类创建了服务自己的线程和消息循环,

* 因此,不会因为服务中的长时处理,而阻塞界面的刷新,影响用户体验。

*/

publicclass LocalService extends Service {

//用于保存本服务自己的消息循环对象Looper

private Looper mServiceLooper;

//用于保存内部类ServiceHandler的对象实例,它继承了Android的Handler类,

//用于处理发送给服务的消息。

private ServiceHandler mServiceHandler;

/**

* 这个类用于给客户端提供绑定对象,因为本示例的服务与客户端运行在同一个

* 主进程中,所以不需要处理进程间通信(IPC)

*/

publicclass LocalBinder extends Binder{

LocalService getService(){

//返回本服务的实例。

return LocalService.this;

}

}

/**

* 服务被首次创建时,系统调用这个方法。

* Android服务组件必须覆写这个方法

*/

@Override

publicvoid onCreate(){

//创建线程对象,并启动线程。

HandlerThread thread = new HandlerThread("ServiceStartArguments", Process.THREAD_PRIORITY_BACKGROUND);

thread.start();

//获取线程的消息循环对象

mServiceLooper = thread.getLooper();

//用线程的消息循环对象创建消息处理对象。

mServiceHandler = new ServiceHandler(mServiceLooper);

}

/**

* 启动类型服务必须实现这个方法,客户端每次调用startService()方法时,

* 系统都会调用这个方法。

* @param intent:它是传递给startService()方法的Intent对象。

* @param flags:有关启动请求的附加数据,可以是:0、START_FLAG_REDELIVERY或START_FLAG_RETRY.

* @param startId:一个唯一的整数,代表一次具体的请求,用于stopSelfResult(int)方法。

*/

@Override

publicint onStartCommand(Intent intent, int flags, int startId){

Log.i("LocalService", "Received star id" + startId + ":" + intent);

//显示服务启动的提示信息

Toast.makeText(this, "service starting", Toast.LENGTH_SHORT).show();

//获取要传递给服务消息循环的Message对象。

Message msg = mServiceHandler.obtainMessage();

//初始化Message对象的成员变量。

msg.arg1 = startId;

msg.obj = "Message processing......" + startId;

//把消息发送给服务线程的消息循环。

mServiceHandler.sendMessage(msg);

returnSTART_STICKY;

}

/**

* 必须覆写这个方法,服务被终止时要调用这个方法,清理服务所占用的资源。

*/

@Override

publicvoid onDestroy(){

//退出服务线程的消息循环。

mServiceLooper.quit();

//显示服务被退出的提示信息。

Toast.makeText(this, R.string.local_service_stopped, Toast.LENGTH_SHORT).show();

}

/**

* 绑定型服务必须覆写这个方法,启动型服务也可覆写这个方法,只要返回null即可。

*/

@Override

public IBinder onBind(Intent intent){

//返回本服务对象实例。

returnmBinder;

}

privatefinal IBinder mBinder = new LocalBinder();

/**

* 该类继承Android的Handler类,为线程的消息循环提供发送和处理消息的功能,

* 本示例覆写了handleMessage()方法,用来处理发送给服务消息循环的消息。

*/

privatefinalclass ServiceHandler extends Handler{

//类实例化时,需要传入服务线程的消息循环对象

public ServiceHandler(Looper looper){

super(looper);

}

/**

* 覆写Handler类的handleMessage()方法,当服务线程的消息循环接收到外部

* 发送的消息时,会调用这个方法来处理对应的消息,本示例只是简单的向用户提示消息被处理的信息。

*/

@Override

publicvoid handleMessage(Message msg){

long endTime = System.currentTimeMillis() + 5 * 1000;

while (System.currentTimeMillis() < endTime){

synchronized(this){

try{

wait(endTime - System.currentTimeMillis());

CharSequence cs = msg.obj.toString();

Toast.makeText(LocalService.this, cs, Toast.LENGTH_SHORT).show();

//showNotification();

}catch(Exception e){

//

}

}

}

//消息被处理之后,终止本服务。

LocalService.this.stopSelf();

}

}

}

G. Android应用组件 —— Service

官方原文: 地址
本文摘录自官方原文,方便自己观看。

service 是一个可以在后台长时间运行的操作而不提供用户界面的应用组件。服务可以由其他应用组件启动,而且即使用户切换到其他应用程序,服务仍将在后台继续运行。此外,组件可以绑定到服务,以与之进行交互,甚至执行进程间的通信(IPC)

服务基本分为两种形式:

启动

绑定

上述虽然分开概括这两种服务,但是服务可以同时以这两种方式运行,也就是说,他既可以是启动服务(以无限期运行),也允许绑定。问题在于是否实现了一组回调方法: onStartCommand() (允许组件启动服务)和 onBing() (允许绑定服务)。

无论应用是出于启动状态还是绑定状态,亦或处于启动并且绑定状态,任何应用组件均可以像使用Activity那么调用Itent来使用服务(即使此服务来自另一应用)。 不过,您可以通过清单文件将服务声明为私有服务,并阻止其他应用访问。 使用清单文件声明服务部分将对此做更详尽的阐述。

注意:
服务在其托管进程的主线程中运行,它既不创建自己的线程,也不在单独的进程中运行(除非另行指定)。这意味着,如果服务将执行任何CPU密集型工作或者阻止性操作(我理解为耗时操作,例如 MP3 播放或联网),则应在服务内创建新线程来完成这项工作。通过使用单独的线程,可以降低发生“应用无响应”(ANR) 错误的风险,而应用的主线程仍可继续专注于运行用户与 Activity 之间的交互。

要创建服务,您必须创建 Service 的子类(或使用它的一个现有子类)。在实现中,您需要重写一些回调方法,以处理服务生命周期的某些关键方面并提供一种机制将组件绑定到服务(如适用)。 应重写的最重要的回调方法包括:

onStartCommand()

onBind()

onCreate()

onDestroy()

如果组件通过调用 startService() 启动服务(这会导致对 onStartCommand() 的调用),则服务将一直运行,直到服务使用 stopSelf() 自行停止运行,或由其他组件通过调用 stopService() 停止它为止。

如果组件是通过调用 bindService() 来创建服务(且未调用 onStartCommand() ,则服务只会在该组件与其绑定时运行。一旦该服务与所有客户端之间的绑定全部取消,系统便会销毁它。

如同 Activity(以及其他组件)一样,您必须在应用的清单文件中声明所有服务。

要声明服务,请添加 <service> 元素作为 <application> 元素的子元素。例如:

为了确保应用的安全性, 请始终使用显式 Intent 启动或绑定 Service,且不要为服务声明 Intent 过滤器。 启动哪个服务存在一定的不确定性,而如果对这种不确定性的考量非常有必要,则可为服务提供 Intent 过滤器并从 Intent 中排除相应的组件名称,但随后必须使用 setPackage() 方法设置 Intent 的软件包,这样可以充分消除目标服务的不确定性。

此外,还可以通过添加 android:exported 属性并将其设置为 "false" ,确保服务仅适用于您的应用。这可以有效阻止其他应用启动您的服务,即便在使用显式 Intent 时也如此

Service

IntentService

简单地说,服务是一种即使用户未与应用交互也可在后台运行的组件。 因此,您应仅在必要时才创建服务。

如需在主线程外部执行工作,不过只是在用户正在与应用交互时才有此需要,则应创建新线程而非服务。 例如,如果您只是想在 Activity 运行的同时播放一些音乐,则可在 onCreate() 中创建线程,在 onStart() 中启动线程,然后在 onStop() 中停止线程。您还可以考虑使用 AsyncTask 或 HandlerThread,而非传统的 Thread 类。

前台服务被认为是用户主动意识到的一种服务,因此在内存不足时,系统也不会考虑将其终止。 前台服务必须为状态栏提供通知,放在“正在进行”标题下方,这意味着除非服务停止或从前台移除,否则不能清除通知。

要请求让服务运行于前台,请调用 startForeground() 。此方法采用两个参数:唯一标识通知的整型数和状态栏的 Notification 。例如:

注意 :提供给 startForeground() 的整型 ID 不得为 0。

要从前台移除服务,请调用 stopForeground() 。此方法采用一个布尔值,指示是否也移除状态栏通知。 此方法不会停止服务。 但是,如果您在服务正在前台运行时将其停止,则通知也会被移除。

与 Activity 类似,服务也拥有生命周期回调方法,您可以实现这些方法来监控服务状态的变化并适时执行工作。 以下框架服务展示了每种生命周期方法:

:与 Activity 生命周期回调方法不同,您 需要调用这些回调方法的超类实现。

:尽管启动服务是通过调用 stopSelf() 或 stopService() 来停止,但是该服务并无相应的回调(没有 onStop() 回调)。因此,除非服务绑定到客户端,否则在服务停止时,系统会将其销毁 — onDestroy() 是接收到的唯一回调。

H. Android应用的服务器端可以用C#写吗还是只能用java写

Android应用的服务器端是可以用C#写的:
1、C#是微软公司发布的一种面向对象的、运行于.NET Framework之上的高级程序设计语言。并定于在微软职业开发者论坛(PDC)上登台亮相。C#是微软公司研究员Anders Hejlsberg的最新成果。C#看起来与Java有着惊人的相似;它包括了诸如单一继承、接口、与Java几乎同样的语法和编译成中间代码再运行的过程。但是C#与Java有着明显的不同,它借鉴了Delphi的一个特点,与COM(组件对象模型)是直接集成的,而且它是微软公司 .NET windows网络框架的主角。

2、C#是一种安全的、稳定的、简单的、优雅的,由C和C++衍生出来的面向对象的编程语言。它在继承C和C++强大功能的同时去掉了一些它们的复杂特性(例如没有宏以及不允许多重继承)。C#综合了VB简单的可视化操作和C++的高运行效率,以其强大的操作能力、优雅的语法风格、创新的语言特性和便捷的面向组件编程的支持成为.NET开发的首选语言。

3、C#是面向对象的编程语言。它使得程序员可以快速地编写各种基于MICROSOFT .NET平台的应用程序,MICROSOFT .NET提供了一系列的工具和服务来最大程度地开发利用计算与通讯领域。

4、C#使得C++程序员可以高效的开发程序,且因可调用由 C/C++ 编写的本机原生函数,因此绝不损失C/C++原有的强大的功能。因为这种继承关系,C#与C/C++具有极大的相似性,熟悉类似语言的开发者可以很快的转向C#。

I. 安卓手机中的 android app service 应用可以删除吗

android
app
service是后台运行的系统进程,是不可以删除的。删除之后会导致伏祥系统使用错误,有可能会无法开机、桌面无法显示等异常。
android通过文件管理器打开文件,可以看到很多以缺游搏符号"."开头的文件夹,这些文件都属于系统配置文件或者必要的应磨升用,比如时钟、电话拨号器等等,一旦删除掉的话,手机就会失去基本的系统功能。

J. Android 服务的限制

Google官网将Android服务分为了三种,前台服务,后台服务和绑定服务:

前台服务执行一些用户能注意到的操作。例如,音频应用会使用前台服务来播放音频曲目。前台服务必须显示 通知 。即使用户停止与应用的交互,前台服务仍会继续运行。

后台服务执行用户不会直接注意到的操作。例如,如果应用使用某个服务来压缩其存储空间,则此服务通常是后台服务。

当应用组件通过调用 bindService() 绑定到服务时,服务即处于 绑定 状态。绑定服务会提供客户端-服务器接口,以便组件与服务进行交互、发送请求、接收结果,甚至是利用进程间通信 (IPC) 跨进程执行这些操作。仅当与另一个应用组件绑定时,绑定服务才会运行。多个组件可同时绑定到该服务,但全部取消绑定后,该服务即会被销毁。

我个人理解服务可以分为两种, 前台 和 后台 ,而 绑定 应该是被当作一种状态,因为 前台服务 和 后台服务 都可以进行绑定。

基于这个理解,我们将限制分成了前台和后台两个部分:

从 Android 5.0(API 级别 21)开始,如果使用隐式 Intent 调用 bindService() ,则系统会抛出异常。为确保应用的安全性,在启动 Service 时,请始终使用显式 Intent,且不要为服务声明 Intent 过滤器。

在后台中运行的 Service 会消耗设备资源,这可能会降低用户体验。 为了缓解这一问题,系统对这些 Service 施加了一些限制。

处于前台时,应用可以自由创建和运行前台与后台 Service。

Android 8.0 开始:系统不允许后台应用创建后台 Service。否则该函数将引发一个 IllegalStateException。

Android 8.0 开始:进入后台时,在一个持续数分钟的时间窗内,应用仍可以创建和使用 Service。 在该时间窗结束后,应用将被视为处于 空闲 状态。 此时,系统将停止应用的后台 Service,就像应用已经调用 Service 的 Service.stopSelf() 方法一样。

为了解除这种限制,可以使用 JobScheler 作业替换后台 Service。

在 Android 8.0 之前,创建前台 Service 的方式通常是先创建一个后台 Service,然后将该 Service 推到前台。

而在Android 8.0 之后,系统不允许后台应用创建后台 Service。

解决方案:调用 startForegroundService() ,以在前台启动新 Service。

在系统创建 Service 后,应用有五秒的时间来调用该 Service 的 startForeground() 方法以显示新 Service 的用户可见通知。 如果应用在此时间限制内 未 调用 startForeground() ,则系统将停止此 Service 并声明此应用为 ANR 。

前台服务必须显示优先级为 PRIORITY_LOW 或更高的 状态栏通知 ,这有助于确保用户知道应用正在执行的任务。如果某操作不是特别重要,因而您希望使用最低优先级通知,则可能不适合使用服务;相反,您可以考虑使用 计划作业 。

在 Android 9 (API 28)之后,使用前台服务必须申请 FOREGROUND_SERVICE 权限,否则会报 SecurityException 。 这是普通权限,因此,系统会自动为请求权限的应用授予此权限。

每个运行服务的应用都会给系统带来额外负担,从而消耗系统资源。如果应用尝试使用低优先级通知隐藏其服务,则可能会降低用户正在主动交互的应用的性能。因此,如果某个应用尝试运行拥有最低优先级通知的服务,则系统会在抽屉式通知栏的底部调用出该应用的行为。

以 Android 12 为目标平台的应用在后台运行时无法再启动 前台服务 。

Android 11 及以后,系统对前台服务何时可以访问设备的位置、摄像头或麦克风进行了限制。

如果您的应用以 Android 11 或更高版本为目标平台,且在前台服务中访问摄像头或麦克风,则必须添加 前台服务类型 camera 和 microphone 。

如果你的应用 在后台运行时启动了某项前台服务 :

如果某服务的功能(位置、麦克风 和 相机)受到了限制,则Logcat中会打印如下语句:

热点内容
算法应用化 发布:2025-05-20 18:21:11 浏览:774
安卓手机上的日历怎么显示节假日 发布:2025-05-20 18:07:06 浏览:367
手机安卓音浪变小如何复原 发布:2025-05-20 18:04:44 浏览:165
phpcmd执行 发布:2025-05-20 18:04:31 浏览:780
网络机顶盒缓存清理 发布:2025-05-20 18:03:18 浏览:498
奶粉安佳美可卓哪个好 发布:2025-05-20 18:03:10 浏览:504
java编译程序包不存在 发布:2025-05-20 18:00:58 浏览:93
压缩青贮草 发布:2025-05-20 18:00:55 浏览:157
c语言空字符串 发布:2025-05-20 17:48:03 浏览:611
ie如何记录密码 发布:2025-05-20 17:43:29 浏览:247