Android 系統(tǒng)級(jí)別的Service有好多,可以通過(guò)getSystemService(@ServiceName @NonNull String name)方法得到(通過(guò)@Service注解限定參數(shù)范圍)。
系統(tǒng)Service主要有:
- WINDOW_SERVICE(android.view.WindowManager)
- LAYOUT_INFLATER_SERVICE(android.view.LayoutInflater)
- ACTIVITY_SERVICE(android.app.ActivityManager)
- POWER_SERVICE(android.os.PowerManager)
- ALARM_SERVICE(android.app.AlarmManager)
- NOTIFICATION_SERVICE(android.app.NotificationManager)
- KEYGUARD_SERVICE(android.app.KeyguardManager)
- LOCATION_SERVICE(android.location.LocationManager)
- SEARCH_SERVICE(android.app.SearchManager)
- SENSOR_SERVICE(android.hardware.SensorManager)
- STORAGE_SERVICE(android.os.storage.StorageManager)
- VIBRATOR_SERVICE(android.os.Vibrator)
- CONNECTIVITY_SERVICE(android.net.ConnectivityManager)
- WIFI_SERVICE(android.net.wifi.WifiManager)
- AUDIO_SERVICE(android.media.AudioManager)
- MEDIA_ROUTER_SERVICE(android.media.MediaRouter)
- TELEPHONY_SERVICE(android.telephony.TelephonyManager)
- TELEPHONY_SUBSCRIPTION_SERVICE(android.telephony.SubscriptionManager)
- CARRIER_CONFIG_SERVICE(android.telephony.CarrierConfigManager)
- INPUT_METHOD_SERVICE(android.view.inputmethod.InputMethodManager)
- UI_MODE_SERVICE(android.app.UiModeManager)
- DOWNLOAD_SERVICE(android.app.DownloadManager)
- BATTERY_SERVICE(android.os.BatteryManager)
- JOB_SCHEDULER_SERVICE(android.app.job.JobScheduler)
- NETWORK_STATS_SERVICE(android.app.usage.NetworkStatsManager)
- HARDWARE_PROPERTIES_SERVICE(android.os.HardwarePropertiesManager)
WindowManager
經(jīng)??粗辈サ男』锇閭儠?huì)發(fā)現(xiàn)現(xiàn)在退出直播頁(yè)之后會(huì)有一個(gè)懸浮窗在直播列表上,方便用戶在查看其它直播的時(shí)候仍然可以看到之前的直播內(nèi)容,這個(gè)通過(guò)WindowManager就可以實(shí)現(xiàn)。WindowManager繼承自ViewManager,ViewManager里邊有添加刪除更新View的方法
public void addView(View view, ViewGroup.LayoutParams params);
public void updateViewLayout(View view, ViewGroup.LayoutParams params);
public void removeView(View view);
其中LayoutParams中可以定義View的坐標(biāo),type(window類型),flag(顯示特性),softInputMode,gravity,horizontalMargin,verticalMargin,format,windowAnimations(系統(tǒng)資源),alpha等屬性。只要在調(diào)用這三個(gè)方法就可以了。
LayoutInflater
LayoutInflater比較常用,尤其在Adapter中經(jīng)常會(huì)用到
LayoutInflater.from(context).inflate(R.layout.item, parent, false)
這里注意一下后兩個(gè)參數(shù),parent一般不推薦傳null,如果上邊這種形式返回的是實(shí)例化出來(lái)的View,如果false改為true,返回的為第二個(gè)參數(shù)parent,這點(diǎn)可以從源碼中得到答案。
// We are supposed to attach all the views we found (int temp)
// to root. Do that now.
if (root != null && attachToRoot) {
root.addView(temp, params);
}
// Decide whether to return the root that was passed in or the
// top view found in xml.
if (root == null || !attachToRoot) {
result = temp;
}
root為傳進(jìn)來(lái)的parent,result開始初始化為root,最后返回result。
ActivityManager
ActivityManager的很多方法是通過(guò)ActivityManagerNative實(shí)現(xiàn)的,ActivityManagerNative繼承了Binder并實(shí)現(xiàn)了IActivityManager接口。ActivityManager里常用方法:
//跟當(dāng)前app有關(guān)系的任務(wù)列表
public List<ActivityManager.AppTask> getAppTasks()
//當(dāng)前運(yùn)行的Service列表
public List<RunningServiceInfo> getRunningServices(int maxNum) throws SecurityException
//得到內(nèi)存信息
public void getMemoryInfo(MemoryInfo outInfo)
//設(shè)備配置信息
public ConfigurationInfo getDeviceConfigurationInfo()
//獲取系統(tǒng)運(yùn)行進(jìn)程
public List<RunningAppProcessInfo> getRunningAppProcesses()
AlarmManager
AlarmManager 可以在未來(lái)的一個(gè)時(shí)間點(diǎn)調(diào)起app,到了時(shí)間點(diǎn)是如果app沒有啟動(dòng),系統(tǒng)會(huì)廣播之前設(shè)定的Intent,自動(dòng)啟動(dòng)app。
AlarmManager常用方法
/** @param type {ELAPSED_REALTIME}, {ELAPSED_REALTIME_WAKEUP},
* {RTC}, {RTC_WAKEUP}中的一個(gè),喚醒方式.
* @param triggerAtMillis 設(shè)定的時(shí)間點(diǎn),type方式不同,表示的時(shí)間不同
* @param operation執(zhí)行的Intent.
public void set(int type, long triggerAtMillis, PendingIntent operation)
//重復(fù)Alarm,intervallMillis表示兩次的間隔
public void setRepeating(int type, long triggerAtMillis, long intervalMillis, PendingIntent operation)
//API 19開始上邊兩個(gè)方法設(shè)定的時(shí)間變得不準(zhǔn)確,系統(tǒng)添加了下邊兩個(gè)方法保證嚴(yán)格傳遞。
public void setWindow(int type, long windowStartMillis, long windowLengthMillis, PendingIntent operation)
public void setExact(int type, long triggerAtMillis, PendingIntent operation)
設(shè)置完之后要在工程內(nèi)創(chuàng)建接受Intent的Activity、Broadcast或者Service處理邏輯。
NotificationManager
NotificationManager比較常見,用來(lái)發(fā)送消息通知.
notifyManager = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);
builder = new Notification.Builder(context);
builder.setContentTitle(context.getString(R.string.offline_package_download, mission.getName()))
.setContentText(context.getString(R.string.start_download))
.setSmallIcon(android.R.drawable.stat_sys_download).setProgress(100, 0, true)
.setTicker(context.getString(R.string.start_download)).setAutoCancel(true);
notifyManager.notify(missionId, builder.getNotification());
LocationManager
提供設(shè)備地理位置信息的Service。
LocationManager manager = (LocationManager)getSystemService(LOCATION_SERVICE);
//需要確認(rèn)權(quán)限ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION一個(gè)粗精度,一個(gè)精確精度,至少一個(gè)
manager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 50.0f, new LocationListener() {
@Override
public void onLocationChanged(Location location) {
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onProviderDisabled(String provider) {
}
});
另外,LocationManager里邊還可以獲取并設(shè)置GPS、NetWork等提供獲取位置的方式,這里不在贅述。
SearchManager
實(shí)際開發(fā)中,并不需要直接與SearchManager交互,因?yàn)锳ctivity和Intent(ACTION_SEARCH) 中已經(jīng)提供了搜索的方法。
SensorManager
使用SensorManager時(shí)要注意傳感器的釋放,避免耗電,鎖屏?xí)r系統(tǒng)會(huì)自動(dòng)釋放傳感器。
public class SensorActivity extends Activity implements SensorEventListener {
private final SensorManager mSensorManager;
private final Sensor mAccelerometer;
public SensorActivity() {
mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
}
protected void onResume() {
super.onResume();
mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL);
}
protected void onPause() {
super.onPause();
mSensorManager.unregisterListener(this);
}
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
public void onSensorChanged(SensorEvent event) {
}
}
Vibrator
需要權(quán)限:android.Manifest.permission#VIBRATE
Vibrator使用起來(lái)比較簡(jiǎn)單,兩個(gè)常用方法:
//振動(dòng)milliseconds毫秒
public void vibrate(long milliseconds)
//pattern控制振動(dòng)的開關(guān),數(shù)組內(nèi)第一個(gè)元素表示等待多長(zhǎng)時(shí)間開始振動(dòng),第二個(gè)元素表示振動(dòng)多長(zhǎng)時(shí)間,依次類推。repeat表示從數(shù)組內(nèi)開始重復(fù)振動(dòng)的索引,傳-1表示不重復(fù)。
public void vibrate(long[] pattern, int repeat)
//停止振動(dòng)
public abstract void cancel();
ConnectivityManager
ConnectivityManager提供網(wǎng)絡(luò)連接狀態(tài)查詢,并在網(wǎng)絡(luò)狀態(tài)改變時(shí)通知App。
主要作用:
- 監(jiān)聽網(wǎng)絡(luò)連接(Wi-fi,GPRS,UMTS,等)
- 網(wǎng)絡(luò)連接改變時(shí)發(fā)送廣播
- 網(wǎng)絡(luò)丟失時(shí)試圖故障轉(zhuǎn)移到另一個(gè)網(wǎng)絡(luò)
- 提供查詢大致或精確可用網(wǎng)絡(luò)狀態(tài)的API
- 提供查詢并選定數(shù)據(jù)傳輸網(wǎng)絡(luò)的API
//網(wǎng)絡(luò)是否可用
ConnectivityManager conManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = conManager.getActiveNetworkInfo();
return (networkInfo != null && networkInfo.isConnected());
//判斷Wifi狀態(tài)
ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
return manager.getActiveNetworkInfo().getType() == ConnectivityManager.TYPE_WIFI;
//注冊(cè)廣播,接受網(wǎng)絡(luò)狀態(tài)變化,
IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
registerReceiver(NetworkReceiver, filter);
WifiManager
WifiManager管理各種Wi-fi連接,提供打開、關(guān)閉Wi-fi,連接、斷開連接、添加網(wǎng)絡(luò),瀏覽接入點(diǎn),獲取連接網(wǎng)絡(luò)信息的API。通過(guò)Context.getSystemService(Context.WIFI_SERVICE)獲取實(shí)例時(shí)應(yīng)該使用application context,避免內(nèi)存泄漏。
AudioManager
AudioManager管理音量和鈴聲模式。
//獲取鈴聲模式AudioManager.RINGER_MODE_NORMAL、AudioManager.RINGER_MODE_SILENT、AudioManager.RINGER_MODE_VIBRATE
public int getRingerMode()
//設(shè)置鈴聲模式
public void setRingerMode(int ringerMode)
//獲取流最大音量
public int getStreamMaxVolume(int streamType)
//獲取流最小音量
public int getStreamMinVolume(int streamType)
//獲取流當(dāng)前音量
public int getStreamVolume(int streamType)
//調(diào)整最相關(guān)的流的音量
//direction ADJUST_LOWER、ADJUST_RAISE、ADJUST_SAME、ADJUST_MUTE、ADJUST_UNMUTE
public void adjustVolume(int direction, int flags)
//設(shè)備音量是否鎖定
public boolean isVolumeFixed()
TelephonyManager
通過(guò)TelephonyManager可以獲取手機(jī)卡、運(yùn)營(yíng)商、當(dāng)前網(wǎng)絡(luò)、國(guó)家代碼等信息。
TelephonyManager manager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
Log.e("getDeviceId",manager.getDeviceId());//deviceID
Log.e("getNetworkOperatorName",manager.getNetworkOperatorName());//運(yùn)營(yíng)商名稱
Log.e("isNetworkRoaming",manager.isNetworkRoaming()+"");//是否漫游
Log.e("getNetworkCountryIso",manager.getNetworkCountryIso());//國(guó)家代碼
Log.e("getNetworkType",manager.getNetworkType()+"");//當(dāng)前網(wǎng)絡(luò)類型,2G\3G\4G
Log.e("getSimState",manager.getSimState()+"");//默認(rèn)SIM卡狀態(tài)
Log.e("getSimOperator",manager.getSimOperator());//SIM卡經(jīng)營(yíng)者
Log.e("getSimOperatorName",manager.getSimOperatorName());//SIM卡經(jīng)營(yíng)者名稱
Log.e("getSimCountryIso",manager.getSimCountryIso());//SIM卡經(jīng)營(yíng)者所在國(guó)家代碼
Log.e("getSimSerialNumber",manager.getSimSerialNumber());//SIM卡序列號(hào)
Log.e("getLine1Number",manager.getLine1Number());//手機(jī)號(hào)
... ...
InputMethodManager
InputMethodManager用來(lái)管理軟鍵盤。常用方法包括hide,show,toggle.
InputMethodManager manager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
switch (view.getId()) {
case R.id.hide:
//隱藏軟鍵盤
manager.hideSoftInputFromWindow(editText.getWindowToken(), InputMethodManager.HIDE_IMPLICIT_ONLY);
break;
case R.id.show:
//顯示選擇輸入法懸浮窗
manager.showInputMethodPicker();
//顯示軟鍵盤
manager.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);
break;
case R.id.toggle:
//軟鍵盤開關(guān)
manager.toggleSoftInputFromWindow(editText.getWindowToken(), InputMethodManager.SHOW_IMPLICIT, InputMethodManager.HIDE_IMPLICIT_ONLY);
break;
}
UiModeManager
UiModeManager管理設(shè)備夜間模式和車載模式,常用方法:
UiModeManager manager = (UiModeManager) getSystemService(UI_MODE_SERVICE);
switch (view.getId()){
case R.id.car_mode_yes:
// 開啟車載模式
manager.enableCarMode(0);
break;
case R.id.car_mode_no:
// 關(guān)閉車載模式
manager.disableCarMode(0);
break;
case R.id.night_mode_yes:
// 開啟夜間模式,注意setNightMode只有在開啟車載模式時(shí)才起作用
manager.setNightMode(UiModeManager.MODE_NIGHT_YES);
Log.e(TAG, String.valueOf(manager.getNightMode()));
break;
case R.id.night_mode_no:
// 關(guān)閉夜間模式
manager.setNightMode(UiModeManager.MODE_NIGHT_YES);
Log.e(TAG, String.valueOf(manager.getNightMode()));
break;
}
((Button)view).setText(String.valueOf(manager.getCurrentModeType()));
DownloadManager
DownloadManager用于處理下載長(zhǎng)時(shí)間下載操作。DownloadManager會(huì)在后臺(tái)下載,監(jiān)聽HTTP連接并在下載失敗或者系統(tǒng)重啟或者連接變化是重新下載。請(qǐng)求下載是應(yīng)該注冊(cè)broadcast receiver處理Notification點(diǎn)擊和下載完成后的操作。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_download_manager);
IntentFilter filter = new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE);
BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// reference對(duì)應(yīng)startDownload中manger.enqueue的返回值。
long reference = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1);
Log.e(TAG, "onReceive: "+reference);
}
};
registerReceiver(receiver, filter);
}
public void onClick(View view){
switch (view.getId()){
case R.id.download_start:
startDownload();
break;
}
}
private void startDownload() {
DownloadManager manager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
DownloadManager.Request down = new DownloadManager.Request(Uri.parse(PATH));
down.setDescription("test test");
down.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
down.setDestinationInExternalFilesDir(this, Environment.DIRECTORY_MOVIES,"test.mp4");
long l = manager.enqueue(down);
Log.e(TAG, "startDownload: "+l);
}
BatteryManager
BatteryManager包涵了ACTION_BATTERY_CHANGED這個(gè)Intent的常量和字符串,提供了查詢電量和充電屬性的API。
IntentFilter filter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
Intent batteryStatus = context.registerReceiver(null, filter);
//你可以讀到充電狀態(tài),如果在充電,可以讀到是usb還是交流電
// 是否在充電
int status = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING ||
status == BatteryManager.BATTERY_STATUS_FULL;
// 怎么充
int chargePlug = batteryStatus.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
boolean usbCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_USB;
boolean acCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC;
另外除去上述常見Service之外還有PowerManager、KeyguardManager、StorageManager、MediaRouter、SubscriptionManager、CarrierConfigManager、JobScheduler、NetworkStatsManager、HardwarePropertiesManager后續(xù)補(bǔ)全。