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

一、服务

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();

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值