《》系统服务类——系统级别的Service

我们除了可自己创建服务类之外,还可以使用系统服务类,比如:来电服务类、短信服务类、网络服务类、壁纸服务类、电源服务类等等,接下来我们就介绍一下常用的系统服务类,但是我们并不会将每个类中的所有的功能都介绍一下,只会举一两个典型的用法,至于其他的功能可以随时查阅官方文档,获得系统服务类的方法为Context的如下方法:

getSystemService(Context.TELEPHONY_SERVICE);

其中的TELEPHONY_SERVICE字段是Context为我们提供的常量,返回不同的系统服务可以更改这个字段,上面的这个字段是返回来电服务类

1、网络管理服务——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();
        }
    }

另外,查询系统的网络状态是需要申明权限的,打开清单文件,添加如下权限:

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

注:访问http://developer.android.com/reference/android/Manifest.permission.html可以查看Android系统所有的可声明的权限。

 2、电话管理服务类——TelephonyManager

当有来电时,将电话号码记入指定的文件中

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

配置监听手机通话状态权限

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

 3、短信管理服务——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"/>

Android 系统service toast android systemservice_系统服务

4、音频管理服务类——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赋予特殊的权限

5、振动器服务类——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;
    }
}

 6、手机闹钟服务类——AlarmManager

 1、AlarmManager表面上看起来用途就是开发手机闹钟的,但是它本身是一个全局的定时器,可以设置在指定的时间或者周期中启动其他的组件,包括Activity Service BroadcastReceiver 

2、获取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();
    }
}

7、通知服务类——Notification

1、这个服务类能够在手机的通知栏中显示通知

2、Android3.0 增加了Notification.Builder类,通过该类允许开发者更轻松的创建Notification对象,Notification.Builder提供了如下常用的方法:

setDefaults() 设置通知LED灯, 音乐 、震动等

setAutoCancel() 设置当点击这条通知后,状态栏自动删除通知

setContentTitle() 设置通知标题

setContentText() 设置通知内容

setSmallcon(int) 为通知设置小图标

setLargeIcon(Bitmap)为通知设置大图标

setTick () 设置通知在状态栏的提示文本

setContentIntent() 设置当点击通知后将要启动的程序组件对应的PendingIntent

(注意:由于当我们退出应用时,该应用发出的通知依然会显示在标题栏,并不会因为应用的退出而退出,所以应该使用PendingIntent将Intent包装一下)

3、发送一个消息的步骤非常的简单

首先通过Notification.Builder创建一个Builder对象,

之后通过这个对象的上述的方法设置这个Builder对象的属性值

之后调用Builder对象的build()方法,返回Notification对象

最后通过NotificationManager发送上面创建好的Notification对象

 

4、下面举一个例子:

在布局文件中仅有两个按钮, 当单击一个按钮的时候就会将一条通知发送出去,当我们点击另一个按钮的时候就会将这条通知取消

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

5、上面的程序中的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}) ;

6、注意使用闪关灯和振动器要在Manifest.xml文件中添加权限

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

 

好了先写到这里吧!以后再补充