Android 系统服务(getSystemService)的常用用法介绍(一)

Android 系统服务(getSystemService)的常用用法介绍(一)

0、 什么是系统服务?为什么要使用系统服务

我们在Android开发过程中经常会用到各种各样的系统管理服务,比如对Wifi进行操作时需要使用到WifiManager,对电源进行操作就需要使用到PowerMaager,对于电池得操作就需要使用到BatterManager

可以说,系统服务时Android对于我们开发者所提供的能够对于系统底层进行配置操作的一种方式。了解这些系统服务,对于我们安卓的开发使用起着至关重要的作用。

android中的系统服务众多,而且还要介绍每一种的使用方法,大部分也需要查看源码,分析其使用不足,若全部写成一篇,很长并且冗余耗时。因此,为了大家的观赏疲劳和兴趣,此项目可能分多次进行介绍。

1、获取系统服务的函数

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

public Object getSystemService(@ServiceName String name);

这个方法是Context的方法,在使用的时候为了防止报错,做好通过getApplicationContext()方法来获取到ApplicationContext,来进行调用这个方法。而函数中的参数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();

getSystemService方法目前就先分析10个服务,我自己是在工作的间隙来写的这篇博客,而每一个服务都需要分析代码,百度大量的知识,还要进行练习使用,因此需要耗费太多的时间。

项目持续更新中…

  • 14
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值