Android Service——系統服務類的使用

《》系統服務類——系統級別的Servicehtml

咱們除了可本身建立服務類以外,還可使用系統服務類,好比:來電服務類、短信服務類、網絡服務類、壁紙服務類、電源服務類等等,接下來咱們就介紹一下經常使用的系統服務類,可是咱們並不會將每一個類中的全部的功能都介紹一下,只會舉一兩個典型的用法,至於其餘的功能能夠隨時查閱官方文檔,得到系統服務類的方法爲Context的以下方法:java

getSystemService(Context.TELEPHONY_SERVICE);android

其中的TELEPHONY_SERVICE字段是Context爲咱們提供的常量,返回不一樣的系統服務能夠更改這個字段,上面的這個字段是返回來電服務類數組

一、網絡管理服務——ConnectivityManager網絡

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        //經過getSystemService()方法獲得connectionManager這個系統服務類,專門用於管理網絡鏈接
         ConnectivityManager connectionManager = 
                    (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
         //用於返回網絡信息對象
         NetworkInfo networkInfo = connectionManager.getActiveNetworkInfo();
         //斷定當前的網絡是否可用,即網絡是否處於鏈接狀態
         if(networkInfo != null && networkInfo.isAvailable()){
         Toast.makeText(MainActivity.this, "network is available",Toast.LENGTH_SHORT).show();
        }else{
        Toast.makeText(MainActivity.this, "network is unavailable",Toast.LENGTH_SHORT).show();
        }
    }

另外,查詢系統的網絡狀態是須要申明權限的,打開清單文件,添加以下權限:ide

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

注:訪問http://developer.android.com/reference/android/Manifest.permission.html能夠查看Android系統全部的可聲明的權限。oop

 二、電話管理服務類——TelephonyManager佈局

當有來電時,將電話號碼記入指定的文件中ui

public class MonitorPhone extends Activity
{
    TelephonyManager tManager;

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        // 取得TelephonyManager對象
        tManager = (TelephonyManager) 
            getSystemService(Context.TELEPHONY_SERVICE);
        // 建立一個通話狀態監聽器
        PhoneStateListener listener = new PhoneStateListener()
        {
            @Override
            public void onCallStateChanged(int state, String number)
            {
                switch (state)
                {
                // 無任何狀態
                    case TelephonyManager.CALL_STATE_IDLE:
                        break;
                    case TelephonyManager.CALL_STATE_OFFHOOK:
                        break;
                    // 來電鈴響時
                    case TelephonyManager.CALL_STATE_RINGING:
                        OutputStream os = null;
                        try
                        {
                            os = openFileOutput("phoneList", MODE_APPEND);
                        }
                        catch (FileNotFoundException e)
                        {
                            e.printStackTrace();
                        }
                        PrintStream ps = new PrintStream(os);
                        // 未來電號碼記錄到文件中
                        ps.println(new Date() + " 來電:" + number);
                        ps.close();
                        break;
                    default:
                        break;
                }
                super.onCallStateChanged(state, number);
            }
        };
        // 監聽電話通話狀態的改變
        tManager.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);
    }
}

配置監聽手機通話狀態權限this

<uses-permission android:name="android.permission.READ_PHONE_STATE"/>

 三、短信管理服務——SmsManager

下面的程序是用來發送短信,這個佈局界面很是簡單:兩個輸入文本框,一個用於輸入手機號碼,一個用於輸入短信的內容,還有一個按鈕,當咱們點擊這個按鈕的時候就會發送信息,

public class MainActivity extends Activity {    
    
    Button send ;
    EditText number , content ;
    SmsManager sManager ;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        Button send = (Button)findViewById(R.id.sendButton);
        final EditText number =(EditText)findViewById(R.id.number);
        final EditText content =(EditText)findViewById(R.id.content);
        
        //獲取SmsManager
        sManager = SmsManager.getDefault();
        
        send.setOnClickListener(new OnClickListener(){

            @Override
            public void onClick(View v) {
                
                PendingIntent pi = PendingIntent.getActivity(MainActivity.this,
                        0, new Intent(), 0);
                //發送信息
                sManager.sendTextMessage(number.getText().toString(),
                        null, content.getText().toString(), pi, null);
                Toast.makeText(MainActivity.this, "消息成功送達", 3000).show();
            }
        });
        
    }
}

 

以後須要給這個Activity賦予發送短信的權限

<uses-permission android:name="android.permission.SEND_SMS"/>

四、音頻管理服務類——AudioManager

在程序得到了AudioManager對象以後,接下來就可以調用AudioManager的以下經常使用的方法來控制手機音頻了:

①adjustStreamVolume(int streamType , int direction , int flags)

調整手機指定類型的聲音。其中第一個參數streamType是定聲音的類型,該參數可接受以下的幾個值:

STREAM_ALARM:手機鬧鈴的聲音

STREAM_DTMF:DTMF音調聲音

STREAM_MUSIC:手機音樂的聲音

STREAM_NOTIFICATION:系統提示音

STREAM_SYSTEM:手機系統的聲音

STREAM_RING:手機鈴聲的聲音

STREAM_VOICE_CALL:語音電話的聲音

第二個參數指定對聲音的增大和減小,第三個參數是調整聲音時顯示的標誌,例如指定FLAG_SHPW_UI,則在調整聲音的大小的時候將會出現一個顯示幾秒鐘的音量圈

②setMicrophoneMute(boolean on )設置是否讓麥克靜音

③setMode(int mode )設置聲音的模式,可設置值有NORMAL ,RINGTONE、IN_CALL

④setRingerMode(int ringerMode) 設置手機的電話鈴聲模式,可支持一下幾種屬性值:

RINGER_MODE_NORMAL:正常的手機鈴聲

RINGER_MODE_SILENT:手機鈴聲靜音

RINGER_MODE_VIBRATE:手機震動

⑤setSpeakerphoneOn(boolean on):設置是否打開擴音器

⑥setStreamMute(int streamType , boolean state)

將手機的指定類型的聲音調整爲靜音,其中的streamType參數與adjustStreamVolume方法中的第一個參數的意義相同。

⑦setStreamVolume(int streamType , int index ,int flags)

直接設置手機的指定類型的音量值。其中第一個參數的意義和上面的那個參數同樣

下面就舉一個例子,這個例子用來播放音樂,佈局中有四個按鈕,play用於播放音樂 , up用於增大音量 , down用於減小音量 , 還有一個ToggleButton 開關 mute用於指定是否靜音,其中使用了MediaPlayer來播放音樂,

public class MainActivity extends Activity {    
    
    Button play , up , down ;
    ToggleButton mute ;
    AudioManager aManager ;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        //獲取系統音頻服務
        aManager = (AudioManager)getSystemService(Service.AUDIO_SERVICE);
        play= (Button)findViewById(R.id.play);
        up = (Button)findViewById(R.id.up);
        down = (Button)findViewById(R.id.down);
        mute = (ToggleButton)findViewById(R.id.toggle);
        
        play.setOnClickListener(new OnClickListener(){

            @Override
            public void onClick(View v) {
               初始化MediaPlayer對象,準備播放音樂,
其中的R.raw.earth引用的是res資源文件中的一個MP3音頻文件,須要在res文件中新建一個名爲raw的
文件,在其中放入一個名爲earth.mp3的文件便可
MediaPlayer mPlayer = MediaPlayer.create(MainActivity.this, R.raw.earth); mPlayer.setLooping(true) ; mPlayer.start(); } }); up.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v) { aManager.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_RAISE, AudioManager.FLAG_SHOW_UI); } }); down.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v) { aManager.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_LOWER, AudioManager.FLAG_SHOW_UI); } }); mute.setOnCheckedChangeListener(new OnCheckedChangeListener(){ @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { //指定是否須要靜音 aManager.setStreamMute(AudioManager.STREAM_MUSIC, isChecked); } }); } }

 不須要爲Activity賦予特殊的權限

五、振動器服務類——Vibrator

Vibrator的使用比較簡單,它只有三個簡單的方法來控制手機的震動

①vibrate(long milliseconds):控制手機震動milliseconds毫秒

②vibrate(long [] pattern , int repeat):

指定手機以pattern指定的模式震動,例如:指定pattern爲new int [400 , 800 , 1200 , 1600] ,就是指定在400ms 800ms  1200ms  1600ms 這些時間點交替啓動。關閉手機振動器;其中repeat指定pattern指定的數組的索引,指定對pattern數組中從repeat索引處開始進行震動循環

③cancel( ) :關閉手機震動

實例:當咱們點擊Activity的界面的時候就引起震動:

public class MainActivity extends Activity {    
    
    Vibrator vibrator ;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        vibrator = (Vibrator)getSystemService(Service.VIBRATOR_SERVICE);
        
    }
    
    //重寫onTouchEvent方法
    @Override
    public boolean onTouchEvent(MotionEvent event){
        Toast.makeText(this, "震動來了", Toast.LENGTH_LONG).show();
        vibrator.vibrate(2000);
        return super.onTouchEvent(event) ;
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
}

 六、手機鬧鐘服務類——AlarmManager

 一、AlarmManager表面上看起來用途就是開發手機鬧鐘的,可是它自己是一個全局的定時器,能夠設置在指定的時間或者週期中啓動其餘的組件,包括Activity Service BroadcastReceiver 

二、獲取AlarmMannager的方法仍是調用getSystemService(),一旦程序得到了這個服務類的對象以後就可以調用以下的方法完成一些功能:

①set(int type , long triggerAtTime , PendingIntent operation)

設定在triggerAtTime時間啓動operation參數指定的組件,其中第一個參數指定定時服務類型,該來行能夠有以下的參數接受值:

ELAPSED_REALTIME:指定從如今開始過了必定的時間以後啓動operation指定的組件

ELAPSED_REALTIME_WAKEUP:指定從如今開始時間過了必定的時間以後啓動operation對應的組件,即便系統關機了也會執行

RTC: 指定當系統調用System.currentTimeMillis()方法返回值與triggerAtTime相等時啓動operation 對應的組件

RTC_WAKEUP:指定當系統調用System.currentTimeMillis()方法返回值與triggerAtTime相等時啓動operation 對應的組件,即便系統關機了也會執行

③setInexactRepeating(int type , long triggerAtTime , long interval , PendingIntent operation)

設置一個非精確的週期任務。例如:每一個一個小時啓動一次,可是系統並不必定老是在每一個小時的開始啓動Alarm服務

④setRepeating(int type , long triggerAtTime , long interval , PendingIntent operation)

設置一個週期性執行的定時服務

⑤cancel(PendingIntent operation)

取消定時服務

舉例:下面的程序用來開發一個設定鬧鐘的功能:

AlarmTest.java文件

public class AlarmTest extends Activity
{
    Button setTime;
    AlarmManager aManager;
    Calendar currentTime = Calendar.getInstance();

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        // 獲取程序界面的按鈕
        setTime = (Button) findViewById(R.id.setTime);
        // 獲取AlarmManager對象
        aManager = (AlarmManager) getSystemService(
            Service.ALARM_SERVICE);
        // 爲「設置鬧鈴」按鈕綁定監聽器。
        setTime.setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View source)
            {
                Calendar currentTime = Calendar.getInstance();
                // 建立一個TimePickerDialog實例,並把它顯示出來。
                new TimePickerDialog(AlarmTest.this, 0, // 綁定監聽器
                    new TimePickerDialog.OnTimeSetListener()
                    {
                        @Override
                        public void onTimeSet(TimePicker tp,
                            int hourOfDay, int minute)
                        {
                            // 指定啓動AlarmActivity組件
                            Intent intent = new Intent(AlarmTest.this,
                                AlarmActivity.class);
                            // 建立PendingIntent對象
                            PendingIntent pi = PendingIntent.getActivity(
                                AlarmTest.this, 0, intent, 0);
                            Calendar c = Calendar.getInstance();
                            // 根據用戶選擇時間來設置Calendar對象
                            c.set(Calendar.HOUR, hourOfDay);
                            c.set(Calendar.MINUTE, minute);
                            // 設置AlarmManager將在Calendar對應的時間啓動指定組件
                            aManager.set(AlarmManager.RTC_WAKEUP,
                                c.getTimeInMillis(), pi);                            
                            // 顯示鬧鈴設置成功的提示信息
                            Toast.makeText(AlarmTest.this, "鬧鈴設置成功啦"
                                , Toast.LENGTH_SHORT).show();
                        }
                    }, currentTime.get(Calendar.HOUR_OF_DAY), currentTime
                        .get(Calendar.MINUTE), false).show();
            }
        });
    }
}

 

AlarmActivity.java文件(注意這個Activity中沒有加載任何的佈局,只是在時間到達以後顯示一個Dialog而已)

public class AlarmActivity extends Activity
{
    MediaPlayer alarmMusic;

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        // 加載指定音樂,併爲之建立MediaPlayer對象
        alarmMusic = MediaPlayer.create(this, R.raw.alarm);
        alarmMusic.setLooping(true);
        // 播放音樂
        alarmMusic.start();
        // 建立一個對話框
        new AlertDialog.Builder(AlarmActivity.this)
            .setTitle("鬧鐘")
            .setMessage("鬧鐘響了,Go!Go!Go!")
            .setPositiveButton("肯定", new OnClickListener()
            {
                @Override
                public void onClick(DialogInterface dialog, int which)
                {
                    // 中止音樂
                    alarmMusic.stop();
                    // 結束該Activity
                    AlarmActivity.this.finish();
                }
            }).show();
    }
}

七、通知服務類——Notification

一、這個服務類可以在手機的通知欄中顯示通知

二、Android3.0 增長了Notification.Builder類,經過該類容許開發者更輕鬆的建立Notification對象,Notification.Builder提供了以下經常使用的方法:

setDefaults() 設置通知LED燈, 音樂 、震動等

setAutoCancel() 設置當點擊這條通知後,狀態欄自動刪除通知

setContentTitle() 設置通知標題

setContentText() 設置通知內容

setSmallcon(int) 爲通知設置小圖標

setLargeIcon(Bitmap)爲通知設置大圖標

setTick () 設置通知在狀態欄的提示文本

setContentIntent() 設置當點擊通知後將要啓動的程序組件對應的PendingIntent

(注意:因爲當咱們退出應用時,該應用發出的通知依然會顯示在標題欄,並不會由於應用的退出而退出,因此應該使用PendingIntent將Intent包裝一下)

三、發送一個消息的步驟很是的簡單

首先經過Notification.Builder建立一個Builder對象,

以後經過這個對象的上述的方法設置這個Builder對象的屬性值

以後調用Builder對象的build()方法,返回Notification對象

最後經過NotificationManager發送上面建立好的Notification對象

 

四、下面舉一個例子:

在佈局文件中僅有兩個按鈕, 當單擊一個按鈕的時候就會將一條通知發送出去,當咱們點擊另外一個按鈕的時候就會將這條通知取消

public class MainActivity extends Activity {
    
    NotificationManager nm ;
    //用這個變量來惟一的標定一個Notification對象
    final static int NOTIFY = 0x123; 

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        nm = (NotificationManager)getSystemService(Service.NOTIFICATION_SERVICE) ;
    }
    

    public void send(View view){
        Intent intent = new Intent(MainActivity.this , OtherActivity.class);
        PendingIntent pi = PendingIntent.getActivity(MainActivity.this, 0, intent, 0);
        
        Notification notify =new Notification.Builder(this) 
        //設置打開通知後, 該標題欄通知自動消失
        .setAutoCancel(true)
        //設置顯示在狀態欄中的通知提示信息
        .setTicker("有新消息")
        //設置通知的圖標,注意圖片不可以太大,不然不可以正常的顯示
        .setSmallIcon(R.drawable.picture)
        //設置通知內容的標題
        .setContentTitle("一條新消息")
        //設置通知內容
        .setContentText("阿奇從遠方發來賀電")
        //設置使用系統默認的聲音、默認LED燈
        //.setDefaults(Notification.DEFAULT_SOUND|Notification.DEFAULT_LIGHTS)
        //設置通知的自定義聲音
        .setSound(Uri.parse("android.resource://com.penglee.notification/"+R.raw.msg))
        //設置消息中顯示的發送時間
        .setWhen(System.currentTimeMillis())
        .setShowWhen(true)   //設置是否setWhe指定的顯示時間
        //設置點擊通知將要啓動程序的Intent
        .setContentIntent(pi)
        //返回Notification對象
        .build();
        
        //發送通知
        nm.notify(NOTIFY , notify);

    }
    
    public void del(View view){
        nm.cancel(NOTIFY);
    }
}


五、上面的程序中的setDefault()方法爲Notification設置了聲音、震動提示、閃光燈等系統級別的屬性。該方法的參數可以支持的屬性值有:

Notification.DEFAULT_SOUND 使用系統默認的聲音

Notification.DEFAULT_VIBRATE 使用系統默認的震動方式

Notification.DEFAULT_LIGHTS  使用系統默認的閃光燈

Notification.DEFAULT_ALL  使用默認的聲音、震動 、閃光燈

若是不想使用系統默認的屬性的話,能夠自定義:

setSound(Uri.parse("file:///sdcard/click.mp3")) ;
setVibrate(new long [] {0 , 50 , 100 , 150}) ;


六、注意使用閃關燈和振動器要在Manifest.xml文件中添加權限

<uses-permission android:name="android.permission.FLASHLIGHT"/>
 <uses-permission android:name="android.permission.VIBRATE"/>

 

好了先寫到這裏吧!之後再補充

相關文章
相關標籤/搜索