Android 系統(tǒng) Service

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ǔ)全。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容