Android组件之Service 与常用系统服务用法详解

1,344 阅读7分钟

一、服务

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;        }    };

LocalServiceonBind中返回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();