Android系统服务

Android 系统服务(getSystemService)

注:本文最后面会列出最常用的几种系统服务和其API用法,需要可直接下滑查看
Android 系统服务(getSystemService)的常用用法介绍
什么是系统服务?为什么要使用系统服务
我们在Android开发过程中经常会用到各种各样的系统管理服务,比如对Wifi进行操作时需要使用到WifiManager,对电源进行操作就需要使用到PowerMaager,对于电池得操作就需要使用到BatterManager…
可以说,系统服务时Android对于我们开发者所提供的能够对于系统底层进行配置操作的一种方式。了解这些系统服务,对于我们安卓的开发使用起着至关重要的作用。

Android的系统服务一览

Android系统服务大致分为三大类:Native系统服务、Java系统服务和本地守护进程。
运行在system server进程中的服务比较多,这是整个android框架的基础

1、Native服务:

由c++语言编写,运行在本地守护进程中。比如mediaserver守护进程中就包含AudioFlinger、MediaPlayerService、CameraService、AudioPolicyService和SoundTriggerHwService等服务。在
mediaserver进程的main函数中,初始化这些服务的实例,代码如下:
int main(int argc __unused, char** argv)
{

sp proc(ProcessState::self());
sp sm = defaultServiceManager();
ALOGI(“ServiceManager: %p”, sm.get());
AudioFlinger::instantiate();
MediaPlayerService::instantiate();
CameraService::instantiate();
AudioPolicyService::instantiate();
SoundTriggerHwService::instantiate();

ProcessState::self()->startThreadPool();
IPCThreadState::self()->joinThreadPool();}
在所属进程初始化的时候会将Native系统服务注册到ServiceManager中。这样,其他的应用或服务就可以通过binder机制调用Native系统服务了。
当然,我们也可以自己开发一个Native系统服务,实现其Binder接口,这样Native层的其他应用或服务就可以调用该服务了。
如果我们开发的Native系统服务想提供给Java层应用使用,就需要实现一个Java接口,然后通过JNI调用Native系统服务。
SurfaceFlinger
这是framebuffer合成的服务,将各个应用程序及应用程序中的逻辑窗口图像数据(surface)合成到一个物理窗口中显示(framebuffer)的服务程序

2、Java服务:

1. 引导服务(7 个):ActivityManagerService、PowerManagerService、LightsService 、 DisplayManagerService、PackageManagerService 、UserManagerService、SensorService;
2. 核 心 服 务 (3 个 ) : BatteryService 、 UsageStatsService 、WebViewUpdateService;
3. 其他服务(70 个+):AlarmManagerService、VibratorService 等。

这部分的服务大部分都有一个供应用进程使用的manager类,这就是一个RPC调用,用户通过调用xxxManager的方法,实际上通过Binder远程调用到system_server进程中对应的xxxManagerService中对应的方法,并将结果再通过binder带回。

1. EntropyService
熵服务,周期性的加载和保存随机信息。主要是linux开机后,/dev/random的状态可能是可预知的,这样一些需要随机信息的应用程序就可能会有问题。这个无需提供应用程序接口。
2. PowerManagerService –> PowerManager
Android 的电源管理也是很重要的一部分。比如在待机的时候关掉不用的设备,待机时屏幕和键盘背光的关闭,用户操作的时候该打开多少设备等等。
3. ActivityManagerService->ActivityManager
这个是整个Android framework框架中最为核心的一个服务,管理整个框架中任务、进程管理, Intent解析等的核心实现。虽然名为Activity的Manager Service,但它管辖的范围,不只是Activity,还有其他三大组件,和它们所在的进程。也就是说用户应用程序的生命管理,都是由他负责的。
4. TelephonyRegistry->TelephonyManager
电话注册、管理服务模块,可以获取电话的链接状态、信号强度等等。<可以删掉,但要看的大概明白>
5. PackageManagerService -> PackageManager
包括对软件包的解包,验证,安装以及升级等等,对于我们现在不能安装.so文件的问题,应该先从这块着手分析原因。
6. AccountManagerService -> AccountManager
Android账户服务,提供了对账户、password、授权的集中管理。
7. ContentService -> ContentResolver
内容服务,主要是数据库等提供解决方法的服务。
8. BatteryService
监控电池充电及状态的服务,当状态改变时,会广播Intent
9. HardwareService
一般是ring和vibrate的服务程序
10. SensorService -> SensorManager
管理Sensor设备的服务,负责注册client设备及当client需要使用sensor时激活Sensor
11. WindowManagerService -> WindowManager -> PhoneWindowManager
和ActivityManagerService高度粘合
窗口管理,这里最核心的就是输入事件的分发和管理。
12. AlarmManagerService -> AlarmManager
闹钟服务程序
13. BluetoothService -> BluetoothDevice
蓝牙的后台管理和服务程序
14. StatusBarService -> StatusBarManager
负责statusBar上图标的更新、动画等等的服务,服务不大。
15. ClipboardService -> ClipboardManager
和其他系统的clipBoard服务类似,提供复制黏贴功过。
16. InputMethodManagerService -> InputMethodManager
输入法的管理服务程序,包括何时使能输入法,切换输入法等等。
17. NetStatService
手机网络服务
18. ConnectivityService -> ConnectivityManager
网络连接状态服务,可供其他应用查询,当网络状态变化时,也可广播改变。
19. AccessibilityManagerService-> AccessibilityManager
这块可能要仔细看一下,主要是一些View获得点击、焦点、文字改变等事件的分发管理,对整个系统的调试、问题定位等,也需要最这个服务仔细过目一下。
20. NotificationManagerService -> NotificationManager
负责管理和通知后台事件的发生等,这个和statusbar胶黏在一起,一般会在statusbar上添加响应图标。用户可以通过这知道系统后台发生了什么事情。
21. MountService
磁盘加载服务程序,一般要和一个linux daemon程序如vold/mountd等合作起作用,主要负责监听并广播device的mount/unmount/bad removal等等事件。
22. DeviceStorageMonitorService
监控磁盘空间的服务,当磁盘空间不足10%的时候会给用户警告
23. LocationManagerService -> LocationManager
要加入GPS服务等,这部分要细看,现在应用中的navigation没响应,可以从此处着手看一下
24. SearchManagerService -> SearchManager
The search manager service handles the search UI, and maintains a registry of searchable activities.
25. Checkin Service(FallbackCheckinService)
貌似checkin service是google提供的包,没有源代码,源码只有fallbackCheckinService
**26. WallpaperManagerService -> WallpaperManager
**管理桌面背景的服务,深度定制化桌面系统,需要看懂并扩展<同时要兼容>这部分
27. AudioService -> AudioManager
AudioFlinger的上层管理封装,主要是音量、音效、声道及铃声等的管理
28. HeadsetObserver
耳机插拔事件的监控小循环
29. DockObserver
如果系统有个座子,当手机装上或拔出这个座子的话,就得靠他来管理了
30. BackupManagerService -> BackupManager
备份服务
31. AppWidgetService -> AppWidgetManager
Android可以让用户写的程序以widget的方式放在桌面上,这就是这套管理和服务的接口
32. StatusBarPolicy
管理哪个图标该在status bar上显示的策略。
33.AssetAtlasService
负责将预载入的bitmap组装成纹理贴图,生成的纹理贴图能够被用来跨进程使用,以降低内存。
34.BluetoothManagerService
负责蓝牙后台管理和服务。
35.CommonTimeManagementService
管理本地常见的时间服务的配置,在网络配置变化时又一次配置本地服务。
36.ConnectivityService
网络连接状态服务。
37.ConsumerIrService
远程控制,通过红外等控制周围的设备(比如电视等)
38.CountryDetectorService
检測用户国家
39.DevicePolicyManagerService
提供一些系统级别的设置及属性
40.DiskStatsService
磁盘统计服务,供dumpsys使用
33.DisplayManagerService
https://www.jianshu.com/p/b3d8c31902ec
用于管理全局显示生命周期,决定在已连接的物理设备怎样配置逻辑显示,而且通知系统和应用状态的改变。
41.DreamManagerService
屏幕保护。
42.DropBoxManagerService
用于系统执行时日志的存储于管理。
43.IdleMaintenanceService
用于观察设备状态,在设备空暇时运行维护任务。将一些比較耗时的代价比較高的任务放到设备空暇时运行,这样保证用户的体验。
44.InputManagerService
曾经在WindowManagerService中,如今独立了出来,用户处理事件分发。
45.LightsService
光感应传感器服务。
46.LockSettingsService
和锁屏界面中的输入password,手势等安全功能有关。能够保存每一个user的相关锁屏信息。
47.NetworkManagementService
网络管理服务。ANDROID 系统网络连接和管理服务由四个系统服务ConnectivityService、NetworkPolicyManagerService、NetworkManagementService、NetworkStatsService共同配合完毕网络连接和管理功能。ConnectivityService、NetworkPolicyManagerService、NetworkStatsService三个服务都通过INetworkManagementService接口跨进程訪问NetworkManagementService服务,实现与网络接口的交互及信息读取。
48.NetworkPolicyManagerService
维护网络使用策略。
49.NetworkStatsService
网络统计相关。
50.NetworkTimeUpdateService
监视网络时间,当网络时间变化时更新本地时间。
51.NsdService
网络服务搜索
52.PrintManagerService
打印服务。
53.RecognitionManagerService
身份识别相关。
54.SamplingProfilerService
用于耗时统计等。
55.SchedulingPolicyService
调度策略。
56.SerialService
对串口的设备进行操作
57.StatusBarManagerService
状态栏。
58.TextServicesManagerService
文本服务,比如文本检查等。
59.TwilightService
指出用户当前所在位置是否为晚上,被UiModeManager等用来调整夜间模式。
60.UiModeManagerService
管理当前Android设备的夜间模式和行车模式.。
61.UsbService
USB Host和device管理服务。
62.VibratorService
振动器服务。
63.WifiP2pService
Wifi Direct服务。
64.WifiService
Wifi服务。
65.WiredAccessoryManager
监视手机和底座上的耳机。

Java系统服务的实现

从android5.1.1开始,Java Service一般都会继承一个虚类SystemService,在其中定义了两个接口onStart和onBootPhase。
onStart() :Java Service启动的时候会回调该函数。
onBootPhase() : 系统启动的各个阶段会回调该函数。
这样,启动服务就很简单了:
mSystemServiceManager.startService(xxxxxxService.class);
我们继续看一下startService的实现:

public class SystemServiceManager {
    // 保存所有SystemService
    private final ArrayList<SystemService> mServices = new ArrayList<SystemService>();

    public SystemService startService(String className) {
        final Class<SystemService> serviceClass;
        try {
            //调用JVM加载className指定的类,会执行该类的静态代码段
            serviceClass = (Class<SystemService>)Class.forName(className);
        } catch (ClassNotFoundException ex) {
            ...}
            ...
        mServices.add(service); // 添加该service
        try {
            service.onStart(); // 回调该service的onStart方法
        } catch (RuntimeException ex) {
            ...}
            ...}}

下面看一下onBootPhase回调方法。
在system启动的一些阶段,系统会调用如下代码,主动回调SystemService的onBootPhase方法。

mSystemServiceManager.startBootPhase(SystemService.PHASE_XXXXXX);
public class SystemServiceManager {
    public void startBootPhase(final int phase) {
        // 阶段值会随着系统启动的进行越来越大,因此下一个阶段值肯定要大于当前阶段
        if (phase <= mCurrentPhase) {
            throw new IllegalArgumentException("Next phase must be larger than previous");}
        mCurrentPhase = phase; //保存当前阶段
        // 遍历所有的SystemService,并回调它的onBootPhase方法。
        final int serviceLen = mServices.size();
        for (int i = 0; i < serviceLen; i++) {
            final SystemService service = mServices.get(i);
            try {
                service.onBootPhase(mCurrentPhase); // 将阶段值也传进去
            } catch (Exception ex) {
                ...}}} }  

PHASE_XXXXXX指示了各个不同的启动阶段,定义如下:

public abstract class SystemService {  
    //默认显示
    public static final int PHASE_WAIT_FOR_DEFAULT_DISPLAY = 100;   
    //锁屏设置准备
    public static final int PHASE_LOCK_SETTINGS_READY = 480; 
    //系统服务准备
    public static final int PHASE_SYSTEM_SERVICES_READY = 500;
    //活动管理准备
    public static final int PHASE_ACTIVITY_MANAGER_READY = 550;
    //第三方应用启动
    public static final int PHASE_THIRD_PARTY_APPS_CAN_START = 600;
    //启动完成
    public static final int PHASE_BOOT_COMPLETED = 1000;}

所以,在onBootPhase(int phase)中,我们可以根据phase中指示的启动阶段,做不同的操作!在自己设计新的系统服务时,这个很重要。因为一些操作需要系统环境的支持,有了这个回调函数及phase参数,我们就可以在合适的阶段做合适的操作了。
另外,Java系统服务中一般还会实现一个方法:systemReady()。该方法在SystemServer.java–>startOtherServices()调用:

final XXXService xxxService;

mActivityManagerService.systemReady(new Runnable() {
    @Override
    public void run() {
        try {
            if (xxxService != null) xxxService.systemReady();
        } catch (Throwable e) {
            reportWtf("making XXX Service ready", e);
        }
            ...}}   

在ActivityManagerService启动过程分析中,我们知道AMS的systemReady方法会回调这个Runnable,上述代码就会执行。
注意:Java系统服务的onStart、onBootPhase、systemReady等方法,都运行在system_server主线程中。建议新建一个线程来处理复杂、耗时操作。
Java系统服务Binder通信
上面讲了Java系统服务的实现,随之而来的一个问题是,其他服务或应用怎么调用Java系统服务的功能?当然是通过Binder通信。
下面就讲一下Java系统服务的Binder服务实现。假设服务名为ExampleService。
首先,需要新建和实现三个文件:
frameworks/base/core/java/android/app/IExample.aidl
frameworks/base/core/java/android/app/Example.java
frameworks/base/services/core/java/android/server/ExampleService.java
frameworks/base/core/java/android/app/IExample.aidl代码如下:
interface IExample {
boolean helloWorld(String str);}
frameworks/base/core/java/android/app/Example.java代码如下:

class Example {
    private final IExample mService;

    Example(Context context, IExample service) {
        mService = service;
    }
    public boolean helloWorld(String str) {
        try {
            return mService.helloWorld(str);
        } catch(RemoteException e) {
            return null;}}}
frameworks/base/services/core/java/android/server/ExampleService.java代码如下:
    class ExampleService extends SystemService {
        private Context mContext;

        public ExampleService(Context context) {
            super(context);
            mContext = context;
        }

        @Override
        public void onStart() {
            publishBinderService(Context.EXAMPLE_SERVICE, new BinderService());
        }

        @Override
        public void onBootPhase(int phase) {
            if (phase == PHASE_SYSTEM_SERVICES_READY) {
                ...
            }

            if (phase == PHASE_ACTIVITY_MANAGER_READY) {
                ...}
            if (phase == PHASE_BOOT_COMPLETED) {
                ...}
                ...}

        public void systemReady() {
            ...}
        class BinderService extend IExample.Stub {
            @Override
                boolean helloWorld(String str) {
                ...}}}

其次,修改如下文件的代码:
frameworks/base/services/java/com/android/server/SystemServer.java
frameworks/base/core/java/android/content/Context.java
frameworks/base/core/java/android/app/SystemServiceRegistry.java
frameworks/base/services/java/com/android/server/SystemServer.java修改如下:

import com.android.server.ExampleService;
public final class SystemServer {
    ExampleService mExampleService = null;
    ...
    private void startOtherServices() {
        ...
        mExampleService = mSystemServiceManager.startService(ExampleService.class);
        ...
        try {
            if (mExampleService != null) mExampleService.systemReady();
        } catch (Throwable e) {
            reportWtf("making Example Service ready", e);
        }
            ...
    }
    frameworks/base/core/java/android/content/Context.java修改如下:
    public abstract class Context {
        ...
        public static final String EXAMPLE_SERVICE = "example";
        ...
    }
    frameworks/base/core/java/android/app/SystemServiceRegistry.java修改如下:
    final class SystemServiceRegistry {
        ...
        registerService(Context.EXAMPLE_SERVICE, Example.class,
                        new CachedServiceFetcher<Example>() {
            @Override
                public Example createService(ContextImpl ctx) {
                IBinder b = ServiceManager.getService(Context.EXAMPLE_SERVICE);
            IExample service = IExample.Stub.asInterface(b);
            if (service == null) {
                Log.wtf(TAG, "Failed to get Example Service.");
            }
            return new Example(ctx.getOuterContext(),service);
        }});
    ...}

最后,其他应用或服务通过binder调用ExampleService的helloWorld方法,代码如下:

import android.app.Example;
class Client {
    static Example mService;
    mService = (Example) context.getSystemService(Context.EXAMPLE_SERVICE);
    mService.helloWorld(str);}

3、mediaServer服务进程(本地守护进程):

init进程根据init.rc文件中的定义,启动本地守护进程。这些进程会常驻在系统中,有的只会启动一次,有的如果退出了,还会被init启动。具体的启动方式就在init.rc中定义。
下面大体列举几个守护进程及其功能。

守护进程功能
vold管理存储设备,自动安装存储设备,将设备分区格式化
netd管理蓝牙、wifi、usb等各种网络连接
installd负责安装及卸载软件包,确认软件包的完整性
rild接收来自于phone应用程序或其他客户端程序发出的调制解调控制请求,并传递给调制解调器
adbd提供可以调试Android的环境
servicemanagerbinder通信大管家
surfaceflinger负责android系统的UI图形显示
mediaserver负责播放音频、视频,camera拍照录像

MediaServer服务基本上都是native的services,mediaServer进程也是在init.rc中启动的,它不是一个daemon进程,这点容易搞混。他也是和systemserver进程类似的系统服务进程,提供应用进程的RPC调用的真正服务代码所运行的位置。其服务都是和媒体录播放有关,主要有三个服务:
AudioFlinger
声音的录播放服务,包括混音等
MediaPlayerService
提供媒体播放服务,opencore是这块的核心模块,对java端的接口在mediaplayer.java
CameraService
提供camera的录制、preview等功能的服务
AudioPolicyService
主要功能有检查输入输出设备的连接状态及系统的音频策略的切换等。

2、获取系统服务的函数

1、安卓中获取系统服务的函数是:

public Object getSystemService(@ServiceName String name);

这个方法是Context的方法,在使用的时候为了防止报错,做好通过getApplicationContext()方法来获取到Application的Context,来进行调用这个方法。而函数中的参数name,是也是Context的属性值。不同的属性值可以得到不同的系统服务。接下来就来总结一下这个方法的使用场景。
2、获取系统服务的各种情况:

1、电源管理(POWER_SERVICE )

其可以用来控制电源状态,设置屏幕的状态信息,和电池待机状态等等

//获取电源相关的服务
PowerManager pm = (PowerManager)context.getSystemService(Context.POWER_SERVICE);

//当我们获取到电源相关的服务的时候,就可以通过其来进行各种操作

//息屏函数,,,,此操作需要权限:android.Manifest.permission#DEVICE_POWER
//这个函数有个坑,参数要使用SystemClock.uptimeMillis()作为基准,才能立即息屏,不然不起作用,而SystemClock.uptimeMillis()+1000,是1秒后息屏
pm.goToSleep(long time);//pm.goToSleep(SystemClock.uptimeMillis());

//亮屏函数,,,,此操作注意点(权限和参数)同上
pm.wakeUp(long time);

//判断屏幕是否是点亮状态
pm.isScreenOn();

//判断手机是否是省电模式,,,当然,也可以使用set方法设置省电模式
pm.isPowerSaveMode();
2、系统还原(RECOVERY_SERVICE)

可以帮助我们调用系统还原等操作

//获取系统还原服务
RecoverySystem rs = (RecoverySystem) context.getSystemService(Context.RECOVERY_SERVICE);

//重启设备,安装一个更新包,,,,需要权限:android.Manifest.permission#REBOOT
re.installPackage(Context context, File packageFile);

//重启设备,清除用户数据分区类似恢复出厂设置,,,,需要权限android.Manifest.permission#REBOOT
re.rebootWipeUserData(Context context);
3、窗口服务(WINDOW_SERVICE)

应用程序用于与窗口管理器通信的接口

//获取窗口服务
WindowManager wm = (WindowManager) context.getSystemService(Service.WINDOW_SERVICE);
WindowManager wm = activity.getWindowManager();

//获取系统的窗口信息,,返回一个Display对象,可以通过display对象来获取到屏幕的宽和高
Display display = wm.getDefaultDisplay();
Point point = new Point();
display.getSize(point);//请不要直接通过getwidth()方法来获取屏幕的高,此种方法官方已废弃,推荐使用getSize()方法
int screenWidth = outSize.x;//屏幕的宽度
int screenHeight = outSize.y;

//WindowManager.LayoutParams是WindowManager的静态内部类,用来管理Window的参数。
4、布局服务(LAYOUT_INFLATER_SERVICE)

这个类是android非常重要的一个类,其功能非常强大,在实际开发中使用非常频繁。在Android中对于一个没有被载入或者想要动态载入的界面,需要使用其来进行载入;而对于一个已经载入的界面,也可以使用其方法来获得其中的界面元素。

//获取布局服务,其有三种获取方式
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Service.LAYOUT_INFLATER_SERVICE);
LayoutInflater inflater = activity.getLayoutInflater();//跟踪源码,可看出其调用的是第三种方式
LayoutInflater inflater = LayoutInflater.from(context);//其内部也是调用的第一种方式,只是加了非空判断

//通过资源中的布局文件创造出其对应的布局view,root表示界面所在的父级,为null时此view为父级
inflater.inflate(@LayoutRes int resource, ViewGroup root);

//通过类名实例化一个view(此方法不常用),,,,name表示类的全名,prefix表示类的前缀,attrs表示类的属性值
inflater.createView(String name, String prefix, AttributeSet attrs);
5、账号管理(ACCOUNT_SERVICE)

对于这个类,应该使用的人相对比较少,它是一个面向应用程序开发的组件,一般用来记录用户的账户,比如在设置中对于账号的管理就是使用的这个服务。百度通过等资料查找,我们一般的账户推荐使用SharedPreferences来记录账户,而唯一鼓励使用AccountManager的场景是,如果你想在多个不同的应用程序之间共享你的帐户,因为数据存储在中央Android数据存储区中所有应用都可以访问(比如淘宝、QQ、微信账户)。注意:这个类的大部分方法都是需要应用的签名匹配的,所以有这个账号管理并不是你就可以看到其他应用的账号了

// 获取账户管理服务
AccountManager account = (AccountManager) context.getSystemService(Service.ACCOUNT_SERVICE);

//通过Context获取与之相关联的AccountManager实例
account.get(Context context);

//通过账户获得与之相关联的密码字符串
account.getPassword(Account account);
account.setPassword(final Account account, final String password);
account.clearPassword(final Account account);

//通过账户和key来获取到用户数据字符串
account.getUserData(Account account, String key);
account.setUserData(Account account, String key, String value);

//得到所有的账户数组
account.getAccounts();
account.getAccountsByTypeForPackage(String type, String packageName) ;//type、包名相关的账户数组
account.getAccountsByType(String type);//type相关的账户数组

//添加一个账户到AccountManager
account.addAccountExplicitly(Account account, String password, Bundle userdata);
account.removeAccountExplicitly(Account account);

//设置账户的可见性
account.setAccountVisibility(Account account, String packageName, int visibility);
account.getAccountVisibility(Account account, String packageName);

//得到账户的上一个名字
account.getPreviousName(Account account);

//添加一个账户
account.addAccount(String accountType, String authTokenType, String[] requiredFeatures, Bundle addAccountOptions, Activity activity, AccountManagerCallback<Bundle> callback, Handler handler);

//重命名账户名
account.renameAccount(Account account, @Size(min = 1) String newName, AccountManagerCallback<Account> callback, Handler handler);

//移除一个账户,返回移除的成功与否集合
account.removeAccount(Account account, AccountManagerCallback<Boolean> callback, Handler handler);

//添加一个账户更新的监听器
account.addOnAccountsUpdatedListener(OnAccountsUpdateListener listener, Handler handler, boolean updateImmediately);
6、Activity服务(ACTIVITY_SERVICE)

这个类可以获取运行中的应用信息,提供有关交互、 activities, services和包含process的信息。 源码注释中说明大多数应用程序开发人员不应该使用此类,因为其中大部分方法都是针对特定用例的。这个类中的许多方法仅用于调试或信息的目的,不应用于影响应用程序的任何运行时行为。这些方法在方法级文档中才会被调用。但是,一些方法可以更广泛地应用。接下来我们一起来看看这个类吧

// 获取activity服务
ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);

//检测你的应用程序是否是低RAM设备
activityManager.isLowRamDevice();

//清除应用程序的数据,返回是否清除成功
activityManager.clearApplicationUserData();

//通过包名获得一个应用程序的所有权限,返回所有永久授权的权限(通常在手机设置中调用)
activityManager.getGrantedUriPermissions(String packageName);

//通过包名清除一个应用程序永久授权的权限(通常在手机设置中调用)
activityManager.clearGrantedUriPermissions(String packageName);

//返回与调用应用程序关联的任务列表
activityManager.getAppTasks();

//返回设备的配置属性
activityManager.getDeviceConfigurationInfo();

//让系统立即终止与给定包相关联的所有后台进程。
activityManager.killBackgroundProcesses(String packageName);

7、闹钟管理(ALARM_SERVICE)

这个类允许你在将来某个时间点运行应用程序。如果目标应用程序尚未运行,则会自动启动它。设备处于休眠状态时会保留已注册的警报(如果设备在此期间关闭,则可以选择将设备唤醒),但如果设备关闭并重新启动,则会清除设备。

// 获取闹钟管理
AlarmManager alarms = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);

//设置一次性闹钟,第一个参数表示闹钟类型,第二个参数表示闹钟执行时间,第三个参数表示闹钟响应动作
alarms.set(int type, long triggerAtMillis, PendingIntent operation);
alarms.setExtra(int type, long triggerAtMillis, PendingIntent operation);//比上面响铃更精准
alarms.setWindow(int type, long triggerAtMillis, long windowLengthMillis, PendingIntent operation);

//设置重复闹钟,参数同上
alarms.setRepeating(int type, long triggerAtMillis, PendingIntent operation);

//取消定时的闹钟
alarms.cancel(PendingIntent operation);

//设置系统墙上的时间,,,,此操作需要权限:
alarms.setTime(long millis);

//设置系统的默认时区
alarms.setTimeZone(long timeZone);
8、状态栏通知管理(NOTIFICATION_SERVICE)

这个类是状态栏通知的管理类,负责进行发通知,清除通知等操作。

// 获取状态栏通知管理
NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);

//在状态栏上发送一个消息,如果你的应用程序已经发送了一个相同id的消息并且还没有取消,则更新此消息。
notificationManager.notify(int id, Notification notification);

//取消一个显示的通知,如果它是暂时的,则view将会被隐藏,如果它是持久的,则将其从状态栏中删除
notificationManager.cancel(int id);

//取消之前显示的所有通知
notificationManager.cancelAll();

//创建一个消息通道,,这个方式还可以恢复删除的通道,以及更新现有通道的名称、描述、重要性。当然,其也可以一次性创建多个通道
notificationManager.createNotificationChannel(NotificationChannel channel);
notificationManager.createNotificationChannels(List<NotificationChannel> channels);
notificationManager.getNotificationChannel(String channelId);//通过id获得一个通道
notificationManager.deleteNotificationChannel(String channelId);//通过id删除一个通道
notificationManager.getNotificationChannels();//通过id删除一个通道

//创建一个消息通道的组容器,比如你的应用程序有多个账户,每个账户都有类似的通道,你就可以为这些账户创建一个具有该账户特定标签的组,而不是将帐户信息附加到每个通道的标签。
notificationManager.createNotificationChannelGroup(NotificationChannelGroup group);
//一次性创建多个消息通道组
notificationManager.createNotificationChannelGroups(List<NotificationChannelGroup> groups);
notificationManager.deleteNotificationChannelGroup(String groupId);//通过id删除一个通道组
notificationManager.getNotificationChannelGroups();//通过id删除一个通道组
9、无障碍服务(ACCESSIBILITY_SERVICE)

无障碍服务是为了帮助残障人士更好使用手机开发出来一个模块,其可以用作各种事件的调度,并提供用于查询系统的可访问性状态的工具。当用户界面中出现明显的事情时会生成辅助功能事件,因此我们可以使用其来做出很多自动化的软件,比如各种辅助工具等等。

// 获取无障碍服务
AccessibilityManager accessibilityManager = (AccessibilityManager) context.getSystemService(Context.ACCESSIBILITY_SERVICE);

//启用了系统中的触摸检测
accessibilityManager.isTouchExplorationEnabled();

//判断系统是否是可辅助的
accessibilityManager.isEnabled();

//发送一个辅助事件
accessibilityManager.sendAccessibilityEvent(AccessibilityEvent event);

//中断所有的辅助事件
accessibilityManager.interrupt();

//通过反馈的类型来得到
accessibilityManager.getEnabledAccessibilityServiceList(int feedbackTypeFlags);

//添加一个辅助状态改变的监听器
accessibilityManager.addAccessibilityStateChangeListener(AccessibilityStateChangeListener listener);
accessibilityManager.removeAccessibilityStateChangeListener(AccessibilityStateChangeListener listener);//移除

//添加一个触摸检测状态转换的监听器
accessibilityManager.addTouchExplorationStateChangeListener(TouchExplorationStateChangeListener listener);
accessibilityManager.removeTouchExplorationStateChangeListener(TouchExplorationStateChangeListener listener);//移除

//通知AccessibilityStateChangeListener进行改变
accessibilityManager.notifyAccessibilityStateChanged();
//通知TouchExplorationStateChangeListener进行改变
accessibilityManager.notifyTouchExplorationStateChanged();
//通知HighTextContrastChangeListener进行改变
accessibilityManager.notifyHighTextContrastStateChanged();

10、字幕管理器(CAPTIONING_SERVICE)

这个类包含访问和监视视频首选字幕状态和可视属性的方法。

// 获取字幕管理器
CaptioningManager captioningManager = (CaptioningManager) context.getSystemService(Context.CAPTIONING_SERVICE);

//返回用户是否启用首选字幕
captioningManager.sEnabled();

//添加或者移除字幕转换监听器
captioningManager.addCaptioningChangeListener(CaptioningChangeListener listener);
captioningManager.removeCaptioningChangeListener(CaptioningChangeListener listener);

//返回用户首选字幕语言的语言环境,如果未指定,则为null
captioningManager.getLocale();

//返回用户首选字幕的可视属性样式,如果未指定,则为默认样式
captioningManager.getUserStyle();

//返回字体缩放系数,如果未指定,则为1
captioningManager.getFontScale();
11、音量管理

Android声音管理AudioManager使用
手机都有声音模式,声音、静音还有震动,甚至震动加声音兼备,这些都是手机的基本功能。在Android手机中,我们同样可以通过Android的SDK提供的声音管理接口来管理手机声音模式以及调整声音大小,这就是Android中AudioManager的使用。
以下分别是AudioManager设置声音模式和调整声音大小的方法。

如何获取声音管理器:

AudioManager audioManager = (AudioManager) this.getSystemService(AUDIO_SERVICE);

里面主要的方法:
A、设置声音模式
//声音模式
AudioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);

//静音模式
AudioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);

//震动模式
AudioManager.setRingerMode(AudioManager.RINGER_MODE_VIBRATE);

B、调整声音大小

//减少声音音量
AudioManager.adjustVolume(AudioManager.ADJUST_LOWER,  0);

//调大声音音量
AudioManager.adjustVolume(AudioManager.ADJUST_RAISE, 0)getMode()获取音频模式
getRingerMode()获取铃声震动模式

    
这里如果使用了和手机震动有关的模式,记得添加权限。android.permission.VIBRATE

//音量控制,初始化定义
AudioManager mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);

//最大音量
int maxVolume = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);

//当前音量
int currentVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);

直接控制音量的多少
if(isSilent){
mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, 0, 0);
}else{
mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, tempVolume, 0); //tempVolume:音量绝对值
}

//降低音量,调出系统音量控制
if
(flag == 0){
mAudioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC,AudioManager.ADJUST_LOWER,
AudioManager.FX_FOCUS_NAVIGATION_UP);
}
else if (flag ==1){//增加音量,调出系统音量控制
mAudioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC,AudioManager.ADJUST_RAISE,
AudioManager.FX_FOCUS_NAVIGATION_UP);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值