一、服务
1.1、后台运行、不可见、没有界面,优先级高于activity,主要用于组件之间交互和执行后台任务。同样在主线程中运行,不能做耗时操作,超过20S会出现ANR。
1.2、 本地服务Local Service:应用程序内部--startService/stopService/stopSelf/stopSelfResult--bindSrevice/unbindService。两种启动模式可以同时运行,在销毁服务时,只有两种模式都不在使用Service时候,才可以销毁服务,否则会引起异常。
1.3、远程服务Remote Service:系统内部应用程序之间--通过定义IBind接口将数据暴露出来
1.4、生命周期:
1.5、服务优先级:服务默认启动方式是后台服务,但是可以通过设置服务为前台服务,提高服务的优先级,进而避免手机内存紧张时,服务进程被杀掉。
startForeground(int,Notification)//设置为前台服务
stopForeground(true);//取消为前台服务
startForeground(int,Notification)//设置为前台服务
stopForeground(true);//取消为前台服务
二、start方式启动服务
--通过启动模式启动的Service,如不主动关闭,Service会一直在。
IntentmBindIntent=newIntent(ServiceMethods.this,BindServiceMethods.class);
startService(mStartIntent);
三、bind方式启动服务
3.1、绑定模式启动的服务会随着绑定逐渐的消亡而解除Service绑定,如果此时Service没有通过启动模式启动,则此服务将会被销毁。
bindService(mBindIntent, serviceConnection, Context.BIND_AUTO_CREATE);
unbindService(serviceConnection);
ServiceConnection serviceConnection = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
LocalService.SimpleBinder sBinder = (LocalService.SimpleBinder)service;
}
};
LocalService的onBind中返回SimpleBinder的示例,以实现绑定组件时服务的交互;
四、调用系统服务
--常用系统服务:StorageManager--存储管理;ClipboardService--提供剪切板功能;PackageManagerService--提供软件包的移除及查看;Vibrator--震动;PowerManager--电源管理;RecoverySystem--系统还原;WindowManager--窗口服务;LayoutInflater--布局服务;ActivityManager;AlarmManager--闹钟;NotificationManager--通知栏管理;ConnectivityManager--网络连接服务;AccessibilityManager--无障碍服务;BatteryManager --电池。
4.1、PackageManager
PackageManager pm = this.getPackageManager();
//1.查询已经安装的应用程序 applicationInfo.flags标识应用类型和部分状态
List<ApplicationInfo> applicationInfos = pm
.getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES);
//2.查询桌面应用
Intent intent = new Intent(Intent.ACTION_MAIN, null);
intent.addCategory(Intent.CATEGORY_DEFAULT);
List<ResolveInfo> resolveInfos = pm.queryIntentActivities(intent,
PackageManager.MATCH_DEFAULT_ONLY);
//3.查询服务
resolveService(Intent intent, int flags)
queryIntentServices(Intent intent, int flags)
getPermissionInfo(String name, int flags) //根据包名和指定的flags获取指定的授权信息
installPackage(Uri packageURI, IPackageInstallObserver observer, int flags,
String installerPackageName); //安装app
installPackageWithVerification(Uri packageURI,
IPackageInstallObserver observer, int flags, String installerPackageName,
Uri verificationURI, ManifestDigest manifestDigest,
ContainerEncryptionParams encryptionParams);
4.2、PowerManager
PowerManager pm = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
//time:系统时间,SystemClock.uptimeMillis()=立即息屏,SystemClock.uptimeMillis()+1000=1秒后息屏
pm.goToSleep(long time);//息屏函数,此操作需要权限:android.Manifest.permission#DEVICE_POWER
pm.wakeUp(long time);
pm.isScreenOn(); //判断屏幕是否是点亮状态
pm.isPowerSaveMode(); //判断手机是否是省电模式
4.3、RecoverySystem
RecoverySystem rs = (RecoverySystem) context.getSystemService(Context.RECOVERY_SERVICE);
//需要权限:android.Manifest.permission.REBOOT
re.installPackage(Context context, File packageFile); //重启设备并安装一个更新包
re.rebootWipeUserData(Context context); //重启并清除data分区,类似恢复出厂设置
4.4、WindowManager
WindowManager wm = (WindowManager) context.getSystemService(Service.WINDOW_SERVICE);
WindowManager wm = activity.getWindowManager();
Display display = wm.getDefaultDisplay(); //获取系统的窗口信息
4.5、LayoutInflater
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Service.LAYOUT_INFLATER_SERVICE);
//下面两种最后也是通过第一种方式获取
LayoutInflater inflater = activity.getLayoutInflater();
LayoutInflater inflater = LayoutInflater.from(context);
inflater.inflate(@LayoutRes int resource, ViewGroup root);
inflater.createView(String name, String prefix, AttributeSet attrs);
4.6、ActivityManager
ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
activityManager.isLowRamDevice();
activityManagergetRunningTask(1).get(0).topActivity.getPackageName //运行信息
activityManager.clearApplicationUserData(); //清除应用程序的数据,返回是否清除成功
activityManager.getAppTasks(); //返回与调用应用程序关联的任务列表
activityManager.getDeviceConfigurationInfo();
activityManager.killBackgroundProcesses(String packageName); //立即终止包名所有后台进程。
//通过包名获得一个应用程序的所有权限,返回所有永久授权的权限(通常在手机设置中调用)
activityManager.getGrantedUriPermissions(String packageName);
activityManager.clearGrantedUriPermissions(String packageName); //清除一个应用程序永久授权的权限
4.7、AlarmManager
AlarmManager alarms = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
/*type: AlarmManager.RTC, 硬件闹钟, 不唤醒设备
AlarmManager.RTC_WAKEUP, 硬件闹钟, 唤醒设备
AlarmManager.ELAPSED_REALTIME, 真实时间流逝, 不唤醒设备
AlarmManager.ELAPSED_REALTIME_WAKEUP, 真实时间流逝, 唤醒设备*/
//设置一次性闹钟,第一个参数表示闹钟类型,第二个参数表示闹钟执行时间,第三个参数表示闹钟响应动作
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); //设置系统的默认时区
4.8、NotificationManager
NotificationManager notificationManager = (NotificationManager)
context.getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(int id, Notification notification); //发送一个通知
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();//删除所有通道
//创建一个消息通道的组容器,比如你的应用程序有多个账户,每个账户都有类似的通道,
//你就可以为这些账户创建一个具有该账户特定标签的组,而不是将帐户信息附加到每个通道的标签。
notificationManager.createNotificationChannelGroup(NotificationChannelGroup group);
//一次性创建多个消息通道组
notificationManager.createNotificationChannelGroups(List<NotificationChannelGroup> groups);
notificationManager.deleteNotificationChannelGroup(String groupId);//通过id删除一个通道组
notificationManager.getNotificationChannelGroups();//通过id删除一个通道组
4.9、AccessibilityManager
AccessibilityManager accessibilityManager = (AccessibilityManager)
context.getSystemService(Context.ACCESSIBILITY_SERVICE);
accessibilityManager.isTouchExplorationEnabled(); //启用了系统中的触摸检测
accessibilityManager.isEnabled(); //判断系统是否是可辅助的
accessibilityManager.sendAccessibilityEvent(AccessibilityEvent event); //发送一个辅助事件
accessibilityManager.interrupt(); //中断所有的辅助事件
accessibilityManager.getEnabledAccessibilityServiceList(int feedbackTypeFlags); //通过反馈的类型来得到
//添加一个辅助状态改变的监听器
accessibilityManager.addAccessibilityStateChangeListener(listener);
accessibilityManager.removeAccessibilityStateChangeListener(listener);//移除
//添加一个触摸检测状态转换的监听器
accessibilityManager.addTouchExplorationStateChangeListener(listener);
accessibilityManager.removeTouchExplorationStateChangeListener(listener);//移除
//通知AccessibilityStateChangeListener进行改变
accessibilityManager.notifyAccessibilityStateChanged();
//通知TouchExplorationStateChangeListener进行改变
accessibilityManager.notifyTouchExplorationStateChanged();
//通知HighTextContrastChangeListener进行改变
accessibilityManager.notifyHighTextContrastStateChanged();
4.10、CaptioningManager--字幕管理器
CaptioningManager captioningManager = (CaptioningManager)
context.getSystemService(Context.CAPTIONING_SERVICE);
captioningManager.sEnabled();//返回用户是否启用首选字幕
captioningManager.getLocale();//返回用户首选字幕语言的语言环境,如果未指定,则为null
captioningManager.getUserStyle();//返回用户首选字幕的可视属性样式,如果未指定,则为默认样式
captioningManager.getFontScale(); //返回字体缩放系数,如果未指定,则为1
4.11、Vibrator--震动
Vibrator vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
vibrator.vibrate(new long[]{100,250,100,250},1);//开始震动
vibrator.cancel(); //取消震动
4.12、ConnectivityManager
ConnectivityManager connManager = (ConnectivityManager)
mContext.getSystemService(Context.CONNCTIVITY_SERVICE)
NetworkInfo mNetworkInfor = connManager.getActiveNetworkInfo();
mNetworkInfo.isAvailable(); //网络是否可用
mNetworkInfo.isConnected(); //网络是否可以进行数据传递,此方法更准确
mNetworkInfo.getType() //获取网络类型,WiFi、移动网
4.13、StorageManager
StorageManager storageManager = (StorageManager)
mContext.getSystemService(Context.STORAGE_SERVICE);
List<StorageVolume> volumeList = storageManager.getStorageVolumes(); //获取各项挂载信息
//可通过广播监听挂载
Intent.ACTION_MEDIA_MOUNTED
Intent.ACTION_MEDIA_UNMOUNTED
public static boolean isStorageMounted(String path) {
IMountService mountService = IMountService.Stub
.asInterface(ServiceManager.getService("mount"));
try {
String state = mountService.getVolumeState(path);
if (state != null && state.equals(Environment.MEDIA_MOUNTED)) return true;
} catch (RemoteException e) {
e.printStackTrace();
}
return false;
}
4.14、WifiManager
WifiManager wifiMgr = (WifiManager)Context.getSystemService(Context.WIFI_SERVICE);
List<ScanResult> scanResults = wifiMgr.getScanResults();//扫描到的周围热点信息
WifiInfo info = wifiMgr.getConnectionInfo();//已连接wifi信息
wifiMgr.setWifiEnabled(boolean) //打开或关闭WIFI
manager.disconnect(); //断开连接
manager.setWifiApEnabled(config, enable) //开启热点
4.15、AudioManager
AudioManager am = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE);
adjustVolume(int direction, int flags) //调节一个单位音量
adjustStreamVolume(int streamType, int direction, int flags)
setStreamVolume(int streamType, int index, intflags) //直接设置音量
getMode() //返回当前的音频模式
setMode() //设置声音模式
getRingerMode() //返回当前的铃声模式
//RINGER_MODE_NORMAL(普通)RINGER_MODE_SILENT(静音)RINGER_MODE_VIBRATE(震动)
setRingerMode(int type)
getStreamVolume(int streamType) //获取音量
getStreamMaxVolume(int streamType)
setStreamMute(int streamType,boolean state) //设置静音
setSpeakerphoneOn(boolean on) //设置是否打开扩音器
setMicrophoneMute(boolean on) //设置是否让麦克风静音
isMicrophoneMute() //判断麦克风是否静音或是否打开
isMusicActive() //判断是否有音乐处于活跃状态
isWiredHeadsetOn() //判断是否插入了耳机。
abandonAudioFocus(AudioManager.OnAudioFocusChangeListenerl) //放弃音频的焦点。
getParameters(String keys) //给音频硬件设置一个varaible数量的参数值。
getVibrateSetting(int vibrateType) //返回是否该用户的振动设置为振动类型。
isBluetoothA2dpOn() //检查是否A2DP蓝牙耳机音频路由是打开或关闭。
isBluetoothScoAvailableOffCall() //显示当前平台是否支持使用SCO的关闭调用用例。
isBluetoothScoOn() //检查通信是否使用蓝牙SCO。
setBluetoothScoOn(boolean on) //要求使用蓝牙SCO耳机进行通讯。
startBluetoothSco/stopBluetoothSco() //启动/停止蓝牙SCO音频连接。
loadSoundEffects() //加载声音效果。
unloadSoundEffects() //卸载音效。
playSoundEffect((int effectType, float volume) //播放声音效果。
//调整最相关的流的音量,或者给定的回退流。
adjustSuggestedStreamVolume(int,int suggestedStreamType intflags)
//注册一个组件MEDIA_BUTTON意图的唯一接收机。
egisterMediaButtonEventReceiver(ComponentName eventReceiver)
//请求音频的焦点。
requestAudioFocus(AudioManager.OnAudioFocusChangeListener l,int streamType,int durationHint)
4.16、SensorManager
sensorManager= (SensorManager) getSystemService(Context.SENSOR_SERVICE);
List<Sensor> allSensors = sensorManager.getSensorList(Sensor.TYPE_ALL);
Sensor sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
sensorManager.registerListener(sensorEventListener, sensor, SensorManager.SENSOR_DELAY_NORMAL);
4.17、ClipboardService
ClipboardManager clipboard = (ClipboardManager)getSystemService(Context.CLIPBOARD_SERVICE);
//复制文本
ClipData clip = ClipData.newPlainText("simple text","Hello, World!"); //把文本封装到ClipData中
clipboard.setPrimaryClip(clip);
//复制intent
ClipData clip = ClipData.newIntent("Intent",appIntent);
clipboard.setPrimaryClip(clip);
//复制url
//联系人的URI
private static final String CONTACTS = "content://com.example.contacts";
private static final String COPY_PATH = "/copy";
Uri copyUri = Uri.parse(CONTACTS + COPY_PATH + "/" + lastName);
ClipData clip = ClipData.newUri(getContentResolver(),"URI",copyUri);
clipboard.setPrimaryClip(clip);
//粘贴
ClipData clip = clipboard.getPrimaryClip();
if (clip != null) {
ClipData.Item item = clip.getItemAt(0);
Uri pasteUri = item.getUri();
String pasteData = item.getText();
Intent pasteIntent = item.getIntent();
}
4.18、BatteryManager
//1.监听Intent.ACTION_BATTERY_CHANGE广播
int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS,0);
boolean present= intent.getBooleanExtra(BatteryManager.EXTRA_PRESENT,false);
int curlevel = intent.getIntExtra(BatteryManager.EXTRA_LEVEL,0);
int maxLevel = intent.getIntExtra(BatteryManager.EXTRA_SCALE,0);
String technology = intent.getStringExtra(BatteryManager.EXTRA_TECHNOLOGY);
int health = intent.getIntExtra(BatteryManager.EXTRA_HEALTH,0);
int temperature= intent.getIntExtra(BatteryManager.EXTRA_TEMPERATURE,0);
int voltage = intent.getIntExtra(BatteryManager.EXTRA_VOLTAGE,0);
int smallIcon = intent.getIntExtra(BatteryManager.EXTRA_ICON_SMALL,0);
int plugged = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED,0);
//2.BatteryManager主动获取
BatteryManager manager = (BatteryManager) getSystemService(BATTERY_SERVICE);
manager.getIntProperty(int id) //获取各项信息 状态、容量、健康信息
manager.isCharging();