一、服务
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); //安装appinstallPackageWithVerification(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_POWERpm.wakeUp(long time);pm.isScreenOn(); //判断屏幕是否是点亮状态pm.isPowerSaveMode(); //判断手机是否是省电模式
4.3、RecoverySystem
RecoverySystem rs = (RecoverySystem) context.getSystemService(Context.RECOVERY_SERVICE); //需要权限:android.Manifest.permission.REBOOTre.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();//返回用户首选字幕语言的语言环境,如果未指定,则为nullcaptioningManager.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) //打开或关闭WIFImanager.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); //复制intentClipData 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();